React 学习之 Effect 问题

前言

记录一次Effect bug 引发的深入了解,
线上 代码

const pageInfo = ({orgFindpage,dispatch}) => {
  let fun4form = {};
  const [form, upForm] = useState({...});

  const fun = {
    async updateForm(){
      const {current} = currProps
      if(current.length === 0) {
        await dispatch({ type: `common/fetchOrgFindpage` });
      }
      
      console.log(orgFindpage)

      form.list.map(curr=>{
        if(curr.key == 'orgId')curr.options.list = currProps.current.map(obj=>{return {label:obj.articleTopicalName+obj.title,value:obj.articleId}});
        return curr;
      });
      upForm({form})
    }
  };

  //自己去拿数据可以 提取成 公共方法来
  useEffect(() => {
    fun.updateForm();
  }, []);

  return (
    <PageHeaderWrapper>
      <FromFactory form={form}> </FromFactory>
    </PageHeaderWrapper>
  );
};
export default connect(({ common:{orgFindpage} }) => ({ orgFindpage }))(pageInfo);

注意这个 orgFindpage 的值 一直输出 []
原因:effect 在每次渲染的时候内部的props 都是在渲染的时候的,而我们这边不管内部是什么值 在其闭包范围内,其 props 的值 始终是之前的
解决方案:使用 useRef 来对数据进行绑定 每次渲染后重新赋值 那么 得到的值 可以是最新的了

成功代码:

const pageInfo = ({orgFindpage,dispatch}) => {
  let fun4form = {};
  const [form, upForm] = useState({...});
  const currProps = useRef(orgFindpage);
  currProps.current = orgFindpage;
  const fun = {
    async updateForm(){
      const {current} = currProps
      if(current.length === 0) {
        await dispatch({ type: `common/fetchOrgFindpage` });
      }
      console.log(orgFindpage,currProps.current)

      form.list.map(curr=>{
        if(curr.key == 'orgId')curr.options.list = currProps.current.map(obj=>{return {label:obj.articleTopicalName+obj.title,value:obj.articleId}});
        return curr;
      });
      upForm({form})
    }
  };

  //自己去拿数据可以 提取成 公共方法来
  useEffect(() => {
    fun.updateForm();
  }, []);

  return (
    <PageHeaderWrapper>
      <FromFactory form={form}> </FromFactory>
    </PageHeaderWrapper>
  );
};
export default connect(({ common:{orgFindpage} }) => ({ orgFindpage }))(pageInfo);

深入学习 ()

参考:精读《useEffect 完全指南》 https://www.cnblogs.com/ascoders/p/10591832.html

useEffect 的常见问题

  • 每次 Render 都有自己的 Props 与 State

可以认为每次 Render 的内容都会形成一个快照并保留下来,因此当状态变更而 Rerender 时,就形成了 N 个 Render 状态,而每个 Render 状态都拥有自己固定不变的 Props 与 State。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章