如果我不解构道具,通过道具传递函数会导致 useEffect 无限循环

Pass function via props cause useEffect infinite loop if I do not destructure props

我有一个带有状态的父组件。我想传递一个处理程序来设置子组件的一些状态。

这是我的父组件。

function ParentComponent() {
  const [filters, setFilters] = useState({});

  const setFiltersHandler = useCallback(filtersObj => {
    setFilters(filtersObj);
  }, []);

  useEffect(() => {
    // Do something and pass this to <Content /> component 
  }, [filters]);

  return (
    <div>
          <Content filters={filters}>
          <SideBarFilters applyFilters={setFiltersHandler} />
    </div>
  );
}

这是我的子组件。这会导致无限循环。

const SideBarFilters = props => {

  const [filterForm, setFilterForm] = useState({
    specialities: {value: "all"}
  });

  // Some code with a input select and the handler to set filterForm

  useEffect(() => {
    let filterObj = {};
    for (let key in orderForm) {
      filterObj = updateObject(filterObj, {
        [key]: orderForm[key]["value"]
      });
    }
    props.applyFilters(filterObj);
  }, [props, orderForm]);


  return <OtherComponent />;
};

但是如果我解构道具,它不会循环。像这样

const SideBarFilters = ({applyFilters}) => {

  // same code as before

  useEffect(() => {
     // same as before
     applyFilters(filterObj);
  }, [applyFilters, orderForm]);


  return <OtherComponent />;
};

我猜这与 React 比较 props 的方式有关。
也许我应该记住所有道具。但我认为这不是一种模式

props 对象在每次父级重新渲染(和重新渲染 SideBarFilters)时都是不同的。

你不应该反对那个。尝试找到解决方法时,您可能 运行 会遇到日期过时的全新问题。

像你一样解构,这是处理挂钩中依赖关系的预期和建议方法。