简体   繁体   English

如何在 setState 后重新渲染组件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM