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

Reactjs 如果我不解构道具,通过道具传递函数会导致useEffect无限循环,reactjs,use-effect,Reactjs,Use Effect,我有一个状态为的父组件。我想传递一个处理程序来设置子组件的一些状态 function ParentComponent() { const [filters, setFilters] = useState({}); const setFiltersHandler = useCallback(filtersObj => { setFilters(filtersObj); }, []); useEffect(() => { // Do something

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

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>
  );
}
这是我的父组件

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>
  );
}
函数ParentComponent(){
const[filters,setFilters]=useState({});
常量setFilterHandler=useCallback(filtersObj=>{
设置过滤器(过滤器OBJ);
}, []);
useffect(()=>{
//执行某些操作并将其传递给组件
},[过滤器];
返回(
);
}
这是我的子组件。这会导致无限循环

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=props=>{
常量[FiltPerform,SetFiltPerform]=useState({
特性:{value:“all”}
});
//一些代码带有一个输入select和设置FILTEXFORM的处理程序
useffect(()=>{
设filterObj={};
for(在订单中输入){
filterObj=更新对象(filterObj{
[键]:订单[键][“值”]
});
}
道具。applyFilters(filterObj);
},[道具,订单];
返回;
};
但如果我分解道具,它不会循环。像这样

const SideBarFilters = ({applyFilters}) => {

  // same code as before

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


  return <OtherComponent />;
};
constsidebarfilters=({applyFilters})=>{
//和以前一样的代码
useffect(()=>{
//和以前一样
应用过滤器(过滤器BJ);
},[ApplyFilter,订单];
返回;
};
我的猜测是,这与如何比较道具有关。

也许我应该记下所有的道具。但我认为这不是一种模式,每次父对象重新渲染(以及重新渲染
侧栏过滤器
)时,props对象的引用都是不同的

你不应该反抗。试图找到解决方法时,您可能会遇到日期陈旧的全新问题


正如您所做的,它是处理钩子中依赖项的预期和建议方法。

props
对象在每次父对象重新呈现(以及重新呈现
SideBarFilters
)时的引用不同

你不应该反抗。试图找到解决方法时,您可能会遇到日期陈旧的全新问题

正如您所做的,它是处理钩子中依赖关系的预期和建议方法