【发布时间】:2021-09-04 06:49:17
【问题描述】:
我正在尝试使用 react 和 redux 搜索数据,我想显示在另一个页面中获得的数据。我有一个获取数据的减速器和一个过滤数据的操作。现在问题来了:我无法过滤数据,也不知道如何在单独的页面中显示它们。 这是我的减速机:
export const SEARCHReducer = (state = { jobs: [] }, action) => {
switch (action.type) {
case 'JOBS_SEARCH_REQUEST':
return { loading: true, jobs: [] }
case 'JOBS_SEARCH_SUCCESS':
const {payload} = action;
const filtered = state.jobs.filter((job)=> job.title.toLowerCase().includes(action.toLowerCase()));
retrn filtered
default:
return state
}
}
在这个减速器中,我得到状态并过滤它们。 这是我的行动:
export const SEARCHAction = () => async (dispatch) => {
try {
dispatch({ type: 'JOBS_SEARCH_REQUEST' })
const { data } = await axios.get('http://localhost:8000/jobs')
dispatch({
type: 'JOBS_SEARCH_SUCCESS',
payload: data,
})
} catch (error) {
console.log(error)
}
}
我的组件是一个功能组件,我正在尝试从 reducer 获取过滤后的数据:
function SearchBar() {
const [allData,setAllData] = useState([]);
const [filteredData,setFilteredData] = useState(allData);
const [searchTerm , setSearchTerm] = useState('')
const dispatch = useDispatch()
const searchItems = useSelector((state) => state.searchItems)
const { loading, filtered} = searchItems;
const getJobs=()=>{
dispatch(SEARCHAction());
setFilteredData(filtered)
}
const handleSearch = (e) =>{
e.preventDefault();
getJobs();
}
return (
<form>
<div>
<input
onChange={e=>setSearchTerm(e.target.value)}
id="search-input"
type="text"
className="form-control job-field lg:col-span-9 h-12 px-3 outline-none"
placeholder="job title, keywords or company name"
/>
<button
type="submit"
onSubmit={handleSearch}
className="btn search-btn border-0 lg:col-span-3">
<i className="fa fa-search mx-1"></i>
</button>
</div>
</form>
<div>
{ loading ?( <p>gettig data</p>) :
filteredData.map((value , index)=>{
return (<p className="bg-black text-white text-3xl">{value.title}</p>)
})}
</div>
</div>
)
}
【问题讨论】:
-
您是否没有获得过滤结果,因为您没有为
JOBS_SEARCH_SUCCESS操作返回任何状态? -
现在我在 reducer 中编辑并返回了过滤后的数据。但什么也没发生
-
嗯,它可能类似于
return { jobs: filtered };,因为您的状态包含一个jobs数组`。您似乎将您的 redux 状态与本地组件状态混为一谈。将传递的状态/道具存储到本地状态也是反模式,只需使用来自 redux 的值。 -
谢谢你,你是对的。但它并没有解决问题
标签: reactjs react-redux