Javascript 在React钩子中是否有设置状态的通用方法?如何管理多个状态?
我有一个问题,如果我可以在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
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如何从中推断出如何动态设置它?