在reactjs中将searchParam数据从一个组件发送到另一个组件



我有一个组件,它在下拉列表中显示数据列表,并且有一个搜索这些数据的选项,可以作为过滤器。这是我的代码:

import React, { useState } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import Popover from '../../Popover';
import Input from '../../Input';
import Icon from '../../Icon';
import IconButton from '../../IconButton';
const DropDownFilter = props => {
const { label, options, onChange, isSearchEnabled } = props;
const [activeOption, setActiveOption] = useState({});
const [filter, setfilter] = useState('');
const searchFilter = event => {
setfilter(event.target.value);
};
const removeFilter = () => {
setfilter('');
};
const lowercasedFilter = filter.toLowerCase();
const filteredData = options.filter(item => {
return Object.keys(item).some(
key => typeof item[key] === 'string' && item[key].toLowerCase().includes(lowercasedFilter)
);
});
const labelText = activeOption.label ? activeOption.label : label;
const handleSelectedOption = option => {
setActiveOption(option);
onChange(option);
};
return (
<div className="filter">
<Popover linkText={labelText} size="small" direction="bottom-left">
{isSearchEnabled && (
<div className="filter__search">
<Input
value={filter}
onChange={searchFilter}
preIcon={
<div role="presentation">
<Icon name="search" />
</div>
}
placeholder="Search"
postIcon={
filter.length > 0 && (
<IconButton
icon={<Icon name="close" />}
size="tiny"
onClick={removeFilter}
standalone={true}
isIconOnly={true}
/>
)
}
/>
</div>
)}
<ul className="filter__options filter__options--scrollbar">
{filteredData.map(option => (
<li
key={option.value}
role="presentation"
className={classNames('filter__options-option', {
'filter__options-option--active': option.value === activeOption.value,
})}
onClick={() => handleSelectedOption(option)}
>
{option.label}
</li>
))}
</ul>
</Popover>
</div>
);
};
DropDownFilter.defaultProps = {
label: 'Filter Menu',
options: [],
isSearchEnabled: true,
};
DropDownFilter.propTypes = {
label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
options: PropTypes.arrayOf(
PropTypes.shape({
label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
})
),
onChange: PropTypes.func.isRequired,
isSearchEnabled: PropTypes.bool,
};
export default DropDownFilter;

这是它的gif图:https://recordit.co/HtalUtuPsj

现在,在搜索过程中,我想将搜索参数的值发送到另一个组件,该值将用于从数据库或该新组件中处理的任何其他外部数据源进行搜索。例如,如果我正在搜索Ratings,则该组件应在其自身组件中的现有选项列表中搜索它,同时在任何其他外部数据源或DB中搜索Ratings。此外部网络呼叫、搜索或任何其他功能将在其他组件中进行处理。因此,该组件将只发送搜索参数;例如CCD_ 3实时地发送到另一个组件。

我可以想到这样一个想法:我将获得一个状态下的searchParam,并将setState值传递给一个新的props,该props将通过onSearchParamChange函数调用,这个新函数将通过回调传递数据,另一个组件将通过调用该组件的props来获取数据。我不确定这是否是正确的方式,而且我也无法在代码中实现这个想法。有更好的方法吗?如果是这样的话,编码实现是什么?

如果您需要传递给父组件,您应该能够使用传递给组件的onChange道具,就像您在handleSelectedOption函数中所做的那样。该函数实际上是将选定的选项传递给父组件。如果您想在用户键入时传递给父组件,那么您也应该在searchFilter:中调用onChange函数

const searchFilter = event => {
const option = event.target.value);
setfilter(option);
onChange(option);
};

如果你想把它传递给一个子组件,你可以把它作为道具传递:

<ChildComponent filter={ filter } />

相关内容

  • 没有找到相关文章

最新更新