4 回答

TA貢獻1875條經驗 獲得超5個贊
一種方式(在許多可能的方式中):
export default function Parent() {
const [state, setState] = useState({name: '', age: '', height: '', eyeColor: ''})
const change = prop => ({target}) => setState(state => ({...state,[prop]:target.value}));
return (
<h1>Title</h1>
<ChildComponent label="Name" value={state['name']} onChange={change('name')}/>
<ChildComponent label="Age" value={state['age']} onChange={change('age')}/>
<ChildComponent label="Eye Color" value={state['eyeColor']} onChange={change('eyeColor')}/>
);
}
export default function ChildComponent({label,value,onChange}) {
return (
<label htmlFor={`${label}Input`}>{label}:</label>
<input name={`${label}Input`} value={value} onChange={onChange}/>
);
}

TA貢獻1829條經驗 獲得超7個贊
您可以使用 的函數形式setState
來訪問當前狀態。
setState
作為第一個參數傳遞當前狀態:
onChange={(e) => setState(currentState => ({...currentState, name: newName}))}

TA貢獻1806條經驗 獲得超8個贊
您可以setState像通過state. 家長:
import React, { useState } from 'react';
import ChildComponent from '../components/ChildComponent
export default function Parent() {
const [state, setState] = useState({name: '', age: '', height: '', eyeColor: ''})
return (
<h1>Title</h1>
<ChildComponent state={state} setState={setState}/>
);
}
孩子:
import React, { useState } from 'react';
export default function ChildComponent({state, setState}) {
return (
<label htmlFor='nameInput'>Name:</label>
<input name='nameInput' value={state.name} onChange={(e) => setState(e.target.value)}/>
);
}

TA貢獻1807條經驗 獲得超9個贊
您可能會受益于利用React.createContext
并React.useContext
在組件之間傳遞狀態。
從文檔:
在典型的 React 應用程序中,數據通過 props 自上而下(父到子)傳遞,但這對于應用程序中許多組件所需的某些類型的 props(例如語言環境首選項、UI 主題)來說可能很麻煩。Context 提供了一種在組件之間共享這些值的方法,而無需顯式地通過樹的每個級別傳遞 prop。
下面是一個示例,說明如何使用上下文在 n 層深的組件之間共享狀態。
const {
? useState,
? useEffect,?
? createContext,
? useContext
} = React;
const ComponentContext = createContext();
function Parent() {?
? const [state, setState] = useState({name: 0, age: 0});
? return (?
? ? <ComponentContext.Provider value={state}>
? ? ? ? <div>Parent</div>
? ? ? ? <Child/>
? ? ? ? <button?
? ? ? ? ? ? onClick={()=>setState({...state, name: state.name+1})}>
? ? ? ? ? ? ? ? Update Name
? ? ? ? </button>
? ? ? ? <button?
? ? ? ? ? ? onClick={()=>setState({...state, age: state.age+1})}>
? ? ? ? ? ? ? ? Update Age
? ? ? ? </button>
? ? </ComponentContext.Provider>
? );
}
function Child() {?
? const {name} = useContext(ComponentContext);
? return <div>
? ? ? <div>1st Child: {name}</div>
? ? ? <Child2/>
? </div>;
}
function Child2() {?
? const {age} = useContext(ComponentContext);
? return <div>2nd Child: {age}</div>;
}
const rootElement = document.getElementById("root");
ReactDOM.render( <Parent /> , rootElement);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.6/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.6/umd/react-dom.production.min.js"></script>
<div id="root"></div>
添加回答
舉報