嘿,我正在尝试使用fancypancy react 状态管理,而且我非常接近让它工作,但由于某种原因,我无法让我以前的状态通过。
const [personalState, setPersonalState] = useState<PersonalState>({
departments: new Map<string, Person[]>(),
filteredDepartments: new Map<string, Person[]>(),
order: "descend",
headings: [
{ name: "Pic", width: "10%", order: "descend" },
{ name: "Name", width: "10%", order: "descend" },
{ name: "phone", width: "20%", order: "descend" },
{ name: "email", width: "20%", order: "descend" },
{ name: "Date of birth", width: "10%", order: "descend" }
],
handleSort: (name: string) => handleSort(name),
handleSearchChange: (e: any) => handleSearchChange(e)
});
// this is only for initalization of state
useEffect(() => {
console.log('Launching use-effect')
api.getPersons().then((results: any) => {
const noduplicates = api.filterDuplicateKeysPersons(results.data.Results);
const personsInDepartments = api.addPersonsToDepartments(noduplicates);
setPersonalState({
...personalState,
departments: personsInDepartments,
filteredDepartments: personsInDepartments,
});
});
}, []);
所以这是代码的一部分。如您所见,我的状态中有函数。当我第一次加载网站时,两个地图都很好,并且可以看到数据。现在当我触发这样的功能时:
const Search = () => {
const context = useContext();
return (
<div className="searchbox">
<div className="input-group">
<div className="input-group-prepend">
<span className="input-group-text" id="">
Search
</span>
</div>
<input
className="form-control mr-sm-2"
type="search"
placeholder="name"
aria-label="Search"
onChange={context.personalState.handleSearchChange}
/>
</div>
</div>
);
}
然后部门和过滤的部门都变为0,基本上是重置。所以数据不会发送到函数。
编辑:根据请求为问题添加更多上下文
// handles search box, filters each person list and creates a new map and puts it under filtered departments
const handleSearchChange = (event: any) => {
const filter = event.target.value;
const newMap = new Map<string, Person[]>();
function searchUsers() {
for (const [key, value] of personalState.departments.entries()) {
const filteredList = value.filter(person => {
let values = person.Eesnimi.toLowerCase() + " " + person.Perekonnanimi.toLowerCase();
if (values.indexOf(filter.toLowerCase()) !== -1) {
return person;
}
return values;
});
newMap.set(key, filteredList);
}
}
searchUsers();
setPersonalState(developerState => {return {...developerState, filteredDepartments: newMap} });
};
注意!我正在尝试使用这个聪明的想法。 https://gist.github.com/JLarky/5a1642abd8741f2683a817f36dd48e78
这些是我正在访问的值。
const returnValue = React.useMemo(() => ({
personalState: personalState,
setPersonalState: setPersonalState
}), [personalState, setPersonalState]);
return returnValue;
编辑 2:我取得了一些进步
我在 handleSearchChange 函数中更改了 setstate
setPersonalState(prevState => {
return {
...prevState,
filteredDepartments: searchUsers(prevState)
}
});
现在在上面的 searchUsers 方法中,我获取了数据,但它不会更新 UI。所以 newMap 一直返回所有数据,这很奇怪。我还在 searchUsers 中获得了额外的回报,它返回了所有数据。删除后它就可以工作了。
我想其他评论员的帮助和我自己的调试暂时帮助解决了这个问题。
答案 0 :(得分:0)
setPersonalState(prevState => {
...prevState,
departments: personsInDepartments,
filteredDepartments: personsInDepartments,
})
需要使用回调来获取之前的状态