Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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钩子中是否有设置状态的通用方法?如何管理多个状态?_Javascript_Reactjs_React Hooks - Fatal编程技术网

Javascript 在React钩子中是否有设置状态的通用方法?如何管理多个状态?

Javascript 在React钩子中是否有设置状态的通用方法?如何管理多个状态?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我有一个问题,如果我可以在React钩子中使用useStategeneric,就像我可以在React组件中管理多个状态一样 state = { input1: "", input2: "", input3: "" // .. more states }; handleChange = (event) => { const { name, value } = event.target; this.setSt

我有一个问题,如果我可以在React钩子中使用
useState
generic,就像我可以在React组件中管理多个状态一样

state = {
  input1: "",
  input2: "",
  input3: ""
  // .. more states
};

handleChange = (event) => {
  const { name, value } = event.target;
  this.setState({
    [name]: value,
  });
};

是的,使用钩子,您可以通过三种方式管理复杂状态(没有第三方库),其中主要原因是管理状态ID及其对应元素

  • 管理具有多个状态的单个对象(请注意,数组是一个对象)
  • 如果(
    1
    )太复杂,请使用
    useReducer
  • 对每个键值对使用多个
    useState
    (考虑其可读性和维护)
  • 看看这个:

    // Ids-values pairs.
    const complexStateInitial = {
      input1: "",
      input2: "",
      input3: ""
      // .. more states
    };
    
    function reducer(state, action) {
      return { ...state, [action.type]: action.value };
    }
    
    export default function App() {
      const [fromUseState, setState] = useState(complexStateInitial);
    
      // handle generic state from useState
      const onChangeUseState = (e) => {
        const { name, value } = e.target;
        setState((prevState) => ({ ...prevState, [name]: value }));
      };
    
      const [fromReducer, dispatch] = useReducer(reducer, complexStateInitial);
    
      // handle generic state from useReducer
      const onChangeUseReducer = (e) => {
        const { name, value } = e.target;
        dispatch({ type: name, value });
      };
     
      return (
        <>
          <h3>useState</h3>
          <div>
            {Object.entries(fromUseState).map(([key, value]) => (
              <input
                key={key}
                name={key}
                value={value}
                onChange={onChangeUseState}
              />
            ))}
            <pre>{JSON.stringify(fromUseState, null, 2)}</pre>
          </div>
    
          <h3>useReducer</h3>
          <div>
            {Object.entries(fromReducer).map(([key, value]) => (
              <input
                name={key}
                key={key}
                value={value}
                onChange={onChangeUseReducer}
              />
            ))}
            <pre>{JSON.stringify(fromReducer, null, 2)}</pre>
          </div>
        </>
      );
    }
    

    请参阅。

    我实际上没有测试这个,但它应该可以工作

    有关更多信息,请参阅

    import React,{useState}来自“React”;
    
    setState(prevState => {
      // Object.assign would also work
      return {...prevState, ...updatedValues};
    });
    
    import React, {useState} from 'react';
    
    const MyComponent = () => {
        const [name, setName] = useState('Default value for name');
        return (<div><button onClick={()=>setName('John Doe')}}>Set Name</button></div>);
    };
    export default MyComponent;
    
    常量MyComponent=()=>{ const[name,setName]=useState(“name的默认值”); 返回(setName('johndoe')}>Set Name);
    setState(prevState => {
      // Object.assign would also work
      return {...prevState, ...updatedValues};
    });
    
    import React, {useState} from 'react';
    
    const MyComponent = () => {
        const [name, setName] = useState('Default value for name');
        return (<div><button onClick={()=>setName('John Doe')}}>Set Name</button></div>);
    };
    export default MyComponent;
    
    };
    setState(prevState => {
      // Object.assign would also work
      return {...prevState, ...updatedValues};
    });
    
    import React, {useState} from 'react';
    
    const MyComponent = () => {
        const [name, setName] = useState('Default value for name');
        return (<div><button onClick={()=>setName('John Doe')}}>Set Name</button></div>);
    };
    export default MyComponent;
    
    导出默认MyComponent;
    正确的方法是创建自己的钩子,在内部使用
    useState

    以下是一个例子:

    //这是您的通用可重用挂钩。
    常量useHandleChange=(首字母)=>{
    const[value,setValue]=React.useState(初始);
    const handleChange=React.useCallback(
    (event)=>setValue(event.target.value),//这是最重要的部分。
    []
    );
    返回[value,handleChange];
    }
    
    setState(prevState => {
      // Object.assign would also work
      return {...prevState, ...updatedValues};
    });
    
    import React, {useState} from 'react';
    
    const MyComponent = () => {
        const [name, setName] = useState('Default value for name');
        return (<div><button onClick={()=>setName('John Doe')}}>Set Name</button></div>);
    };
    export default MyComponent;
    
    常量应用=()=>{ //在这里,我们使用钩子3次,以表明它是可重用的。 const[value1,handle1]=useHandleChange('one'); const[value2,handle2]=useHandleChange('two'); const[value3,handle3]=useHandleChange('three'); 返回 国家:
    • {value1}
    • setState(prevState => {
        // Object.assign would also work
        return {...prevState, ...updatedValues};
      });
      
      import React, {useState} from 'react';
      
      const MyComponent = () => {
          const [name, setName] = useState('Default value for name');
          return (<div><button onClick={()=>setName('John Doe')}}>Set Name</button></div>);
      };
      export default MyComponent;
      
    • {value2}
    • setState(prevState => {
        // Object.assign would also work
        return {...prevState, ...updatedValues};
      });
      
      import React, {useState} from 'react';
      
      const MyComponent = () => {
          const [name, setName] = useState('Default value for name');
          return (<div><button onClick={()=>setName('John Doe')}}>Set Name</button></div>);
      };
      export default MyComponent;
      
    • {value3}
    • setState(prevState => {
        // Object.assign would also work
        return {...prevState, ...updatedValues};
      });
      
      import React, {useState} from 'react';
      
      const MyComponent = () => {
          const [name, setName] = useState('Default value for name');
          return (<div><button onClick={()=>setName('John Doe')}}>Set Name</button></div>);
      };
      export default MyComponent;
      
    }
    setState(prevState => {
      // Object.assign would also work
      return {...prevState, ...updatedValues};
    });
    
    import React, {useState} from 'react';
    
    const MyComponent = () => {
        const [name, setName] = useState('Default value for name');
        return (<div><button onClick={()=>setName('John Doe')}}>Set Name</button></div>);
    };
    export default MyComponent;
    
    ReactDOM.render(,document.querySelector(#app))
    
    
    这不使用react钩子。这是正确的,但不是使用react钩子的方式。
    setState
    来自
    useState
    const[state,setState]=useState(initialState)@DennisVash:我道歉。你说得对。我没有看到您的setState声明,并假设它是OP似乎询问的同一个类setState方法。让我感到困惑的是你使用了相同的方法名。@James:我不想自以为是。我想我们实际上是同意的。你的自定义钩子答案最终可能就是OP想要的答案。你的意思是用状态变量来做这件事吗?如果您使用的是更复杂的状态,那么很明显,这可以像在类组件示例中那样完成。对于前者,请参见my,它演示了动态设置变量状态的能力。@ravibagul91不一定,您可以使用
    useState
    @James来管理复杂状态。是的,这就是我要找的。我会深入研究你的链接答案我不知道这是怎么回答这个问题的?您刚刚给出了一个如何使用
    setState
    的示例,OP如何从中推断出如何动态设置它?