【问题标题】:React previous state not passing in useState对未传入 useState 的先前状态做出反应
【发布时间】:2021-03-08 11:32:31
【问题描述】:

嘿,我正在尝试使用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>
  );
}

然后departments和filtereddepartments归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 中有一个额外的返回,它返回了所有数据。删除后它就可以工作了。

我想其他评论员的帮助和我自己的调试暂时帮助解决了这个问题。

【问题讨论】:

  • 我猜将函数作为状态的一部分传递有点奇怪......你不会改变它们,是吗?如果不是,那么最好从状态中排除 handleSort 和 handleSearchChange 并在外面声明它们。顺便说一句,共享这些函数的主体,它们与状态有什么关系?

标签: reactjs typescript use-state


【解决方案1】:
setPersonalState(prevState => {
    ...prevState,
    departments: personsInDepartments,
    filteredDepartments: personsInDepartments,
  })

你需要使用回调来获取之前的状态

【讨论】:

  • 您的意思是在 useState 中的某处添加 useCallBack?
  • no 不是直接在 setState 中传播personalState,而是使用箭头函数(回调)将先前的状态作为参数。这就是您在 useState 中获得先前状态的方式。你已经在handleSearch函数中自己完成了
  • 嗯我好像不能那样做,我得到语法错误,它认为 prevState 是任何
  • 你可以尝试初始化 useEffect 本身的所有内容吗?
  • 我添加了所有的字段来使用效果。然后我尝试在handlesearchchange中使用setPersonalState,就像你说的那样,但是它给出了一个错误,我只能像这样访问它```setPersonalState(prevState => {return {...prevState,blaah,blaah}})` `` 抱歉,我无法在 cmets 中很好地编辑它
猜你喜欢
  • 2021-10-04
  • 2019-12-09
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 2020-05-23
  • 2022-01-20
  • 2020-05-18
相关资源
最近更新 更多