【问题标题】:How to use seState from child component?如何从子组件使用 setState?
【发布时间】:2023-01-09 18:09:00
【问题描述】:

在这种情况下,如何从子组件使用setDisabled

const ChildButton = () => {
  const [disabled, setDisabled] = useState(false);

  return <div onClick={disabled ? null : console.log('do something')} />
}

从 './ChildButton' 导入 ChildButton;

const Parent = () => {

  const controllSetStateFun = () => {
    // use the child coomponent setDisabled then I can re-render child component from Parent
  };

  return (
    <div>
     <ChildButton />
    </div>
  );
}

【问题讨论】:

标签: reactjs


【解决方案1】:

你需要lift the state up

  1. 在父组件中获取您的状态。

  2. 传递设置状态函数 作为子组件的道具。

  3. 调用 setState 函数 子组件。

    const Parent = () => { const [禁用,setDisabled] = useState(false);

    const controllSetStateFun = () => { // 使用子组件 setDisabled 然后我可以从 Parent 重新渲染子组件 };

    返回 ( ); }

    const ChildButton = ({disabled,setDisabled}) => { //你可以从这里访问setDisable ... 返回 <div onClick={已禁用? null : console.log('做某事')} /> }

【讨论】:

    【解决方案2】:

    你也可以通过传递道具来做到这一点

    const ChildButton = ({disabled, setDisabled}) => {
     
    
      return <div onClick={disabled ? null : console.log('do something')} />
    }
    
    const Parent = () => {
    const [disabled, setDisabled] = useState(false);
    
      const controllSetStateFun = () => {
        // use the child coomponent setDisabled then I can re-render child component from Parent
      };
    
      return (
        <div>
         <ChildButton disabled={disabled} setDisabled={setDisabled}/>
        </div>
      );
    }
    

    【讨论】:

      【解决方案3】:

      请在父组件中定义状态并从子组件更新。

      const Parent = () => {
      const [disabled, setDisabled] = useState(fals
        const controllSetStateFun = () => {
          // use the child coomponent setDisabled then I can re-render child component from Parent
        };
      
        return (
          <div>
           <ChildButton visibility ={disbales} visibilityfunction ={setDisabled} />
          </div>
        );
      }
      
      
      const ChildButton = (props) => {
       
      
        return <div onClick={props.visibilityfunction} />
      }
      

      【讨论】:

        【解决方案4】:

        你可以看看useImperativeHandle

        function Component(props, ref) {
          const [disabled, setDisabled] = useState(false);
        
          React.useImperativeHandle(ref, () => ({
            method: () => {
              setDisabled(true);
            },
          }));
          return <div onClick={disabled ? null : console.log('do something')} />;
        }
        Component = React.forwardRef(Component);
        

        在此示例中,呈现 &lt;Component ref={myRef} /&gt; 的父组件将能够调用 myRef.current.method().

        也可以按照其他答案中的建议提升状态,取决于哪个更适合您。

        【讨论】:

          猜你喜欢
          • 2019-06-23
          • 2020-05-08
          • 2017-10-02
          • 2020-06-03
          • 2021-04-20
          • 1970-01-01
          • 2021-05-27
          • 1970-01-01
          相关资源
          最近更新 更多