[英]How to rerender component after setState
I'd like to react rerender component after every state edit.我想在每次 state 编辑后重新渲染组件。
App component:应用组件:
let [cur1, setCur1] = useState('USD')
let [cur2, setCur2] = useState('EUR')
let [result, setResult] = useState(0)
let currenciesArr = [cur1, cur2]
async function getRate(e) {
e.preventDefault()
setCur1(cur1 = e.target.cur1.value)
setCur2(cur2 = e.target.cur2.value)
let amount = e.target.amount.value
const api_url = await fetch(`https://free.currconv.com/api/v7/convert?q=${cur1}_${cur2}&compact=ultra&apiKey=${API_KEY}`)
const data = await api_url.json()
await setResult(convert(amount, data))
}
I have used Context.Provider for rerender, but it doesn't work.我已经使用 Context.Provider 进行重新渲染,但它不起作用。
return (
<Context.Provider value={{currenciesArr}}>
<div>
<Choose getRate={getRate} chooseCur={chooseCur} chooseCur2={chooseCur2}/>
<ShowRate currencies={currenciesArr} result={result}/>
</div>
</Context.Provider>
)
Component that need to rerender需要重新渲染的组件
function Choose(props) {
const cProps = useContext(Context)
console.log(cProps.currenciesArr);
return(
<div>
<div>
<button onClick={ props.chooseCur } name='RUB'>RUB</button>
<button onClick={ props.chooseCur } name='AUD'>AUD</button>
</div>
<div>
<button onClick={ props.chooseCur2 } name='EUR'>EUR</button>
<button onClick={ props.chooseCur2 } name='GBP'>GBP</button>
</div>
<form onSubmit={props.getRate}>
{cProps.currenciesArr.map((item,i) => {
return(
<input type='text' key={i} name={'cur'+(i+1)} defaultValue={item}></input>
)
})
}
<input type='text' name='amount' defaultValue='1'></input>
<button onClick={(e)=>{console.log(e.target)}} ></button>
</form>
</div>
)
}
Button with prop props.chooseCur
setting state in App component App 组件中带有道具props.chooseCur
设置 state 的按钮
function chooseCur(e) {
e.preventDefault()
setCur1(e.target.name)
}
function chooseCur2(e) {
e.preventDefault()
setCur2(e.target.name)
}
and i'd like to "choose" component will rerender after setState.我想“选择”组件将在 setState 之后重新呈现。
First currenciesArr
should be part of the state as const [currenciesArr, setCurrenciesArr] = useState([cur1, cur2])
首先currenciesArr
应该是 state 的一部分,因为const [currenciesArr, setCurrenciesArr] = useState([cur1, cur2])
Next, you need to call setCurrenciesArr
in your chooseCur2
functions.接下来,您需要在chooseCur2
函数中调用setCurrenciesArr
。 I used a restructuring assignment to get the value of name inside the function. Hooks are called when the event loop is complete.我使用重组赋值来获取 function 中名称的值。当事件循环完成时调用挂钩。 See Capbase Medium post for more information on hooks and the event loop.有关挂钩和事件循环的更多信息,请参阅Capbase Medium 帖子。
In choose.js在选择.js
You need to use value
in your input instead of defaultValue
and set it as readonly to prevent receiving a warning about setting the value.您需要在输入中使用value
而不是defaultValue
并将其设置为只读以防止收到有关设置该值的警告。
Default value provides the value if none is present.如果不存在,则默认值提供值。
See the following codesandbox for a working version.有关工作版本,请参阅以下代码和框。
https://codesandbox.io/s/long-rain-8vyuh https://codesandbox.io/s/long-rain-8vyuh
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.