Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以在react中使用useffect钩子在parent-from-child中设置状态吗_Javascript_Reactjs_React Hooks - Fatal编程技术网

Javascript 我可以在react中使用useffect钩子在parent-from-child中设置状态吗

Javascript 我可以在react中使用useffect钩子在parent-from-child中设置状态吗,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我在子组件中有一组按钮,单击该按钮时,会设置相应的状态值true或false。我在这个子组件中有一个useEffect钩子,它还依赖于所有这些状态值,所以如果单击一个按钮,这个钩子就会调用setFilter,它会作为一个道具从父组件传递下来 const Filter = ({ setFilter }) => { const [cycling, setCycling] = useState(true); const [diy, setDiy] = useState(true);

我在子组件中有一组按钮,单击该按钮时,会设置相应的状态值true或false。我在这个子组件中有一个useEffect钩子,它还依赖于所有这些状态值,所以如果单击一个按钮,这个钩子就会调用setFilter,它会作为一个道具从父组件传递下来

const Filter = ({ setFilter }) => {

  const [cycling, setCycling] = useState(true);
  const [diy, setDiy] = useState(true);

  useEffect(() => {
    setFilter({
      cycling: cycling,
      diy: diy
    });
  }, [cycling, diy]);

  return (
    <Fragment>
      <Row>
        <Col>
          <Button block onClick={() => setCycling(!cycling)}>cycling</Button>
        </Col>
        <Col>
          <Button block onClick={() => setdIY(!DIY)}>DIY</Button>
        </Col>
      </Row>
    </Fragment>
  );
};
constfilter=({setFilter})=>{
const[cycling,setCycling]=useState(true);
const[diy,setDiy]=useState(true);
useffect(()=>{
设置过滤器({
骑自行车:骑自行车,
diy:diy
});
},[骑自行车,自己动手];
返回(
设置循环(!循环)}>循环
setdIY(!DIY)}>DIY
);
};
在父组件中,我显示一个项目列表。我在父对象中有两种效果,一种是初始加载项,另一种是在过滤器更改时激发。为了简洁起见,我删除了大部分代码,但我认为我的用法可以归结为这样一个事实:在呈现ItemDashboard时,过滤器被调用了两次。我怎样才能阻止这种情况发生,或者我应该用另一种方式来看待它

const ItemDashboard = () => {

  const [filter, setFilter] = useState(null);

  useEffect(() => {
    console.log('on mount');
  }, []);

  useEffect(() => {
    console.log('filter');
  }, [filter]);

  return (
    <Container>..
      <Filter setFilter={setFilter} />
    </Container>
  );
}
const ItemDashboard=()=>{
const[filter,setFilter]=useState(null);
useffect(()=>{
console.log('on mount');
}, []);
useffect(()=>{
console.log('filter');
},[filter]);
返回(
..
);
}

是的,您可以,
在子组件中使用effect
,这取决于状态,也是您通常实现受控和非受控组件的方式:

const NOOP = () => {};

// Filter
const Child = ({ onChange = NOOP }) => {
  const [counter, setCounter] = useState(0);

  useEffect(() => {
    onChange(counter);
  }, [counter, onChange]);

  const onClick = () => setCounter(c => c + 1);

  return (
    <div>
      <div>{counter}</div>
      <button onClick={onClick}>Increase</button>
    </div>
  );
};

// ItemDashboard
const Parent = () => {
  const [value, setState] = useState(null);

  useEffect(() => {
    console.log(value);
  }, [value]);

  return <Child onChange={setState} />;
};
constnoop=()=>{};
//滤器
const Child=({onChange=NOOP})=>{
const[counter,setCounter]=useState(0);
useffect(()=>{
onChange(计数器);
},[counter,onChange]);
constonclick=()=>setCounter(c=>c+1);
返回(
{计数器}
增加
);
};
//项目仪表板
常量父项=()=>{
常量[值,设置状态]=使用状态(null);
useffect(()=>{
console.log(值);
},[价值];
返回;
};

我猜,你在寻找成为普通父母的途径

为了做到这一点,您可以将子组件(作为道具传递)的事件处理程序绑定到它们的公共父组件中所需的回调

以下现场演示演示了该概念:

const{render}=ReactDOM,
{useState}=React
康斯特爱好=[“骑自行车”、“DIY”、“徒步旅行”]
常量ChildList=({list})=>(
    {list.map((li,key)=>{li})}
) 常量ChildFilter=({onFilter,visibleLabels})=>( { 嗜好。地图((嗜好,关键)=>( {爱好} onFilter(值,选中)} /> )) } ) 常量父项=()=>{ const[Visible嗜好,SetVisible嗜好]=useState(嗜好), onChangeVisibility=(爱好,可见)=>{ 看得见的 SetVisibleHabiods(VisibleHabiods.filter(h=>h!=Hobiody)): SetVisible嗜好([…Visible嗜好,嗜好]) } 返回( ) } 渲染( , document.getElementById('root')) )

为什么不控制父组件中的所有状态变量?这里的主要问题是什么?它不是用setFilter方法更新父对象的状态吗?是的,它会更新父对象的状态,但对筛选器状态的影响会在加载时触发两次,在我的代码中,筛选器会两次从数据库加载项。这基本上是我已经拥有的,但感谢您的回答。我想我问的问题不对,所以我会再问一个。