【问题标题】:How to update data from child component to parent component using context api in react?如何在反应中使用上下文 api 将数据从子组件更新到父组件?
【发布时间】:2021-11-22 09:30:56
【问题描述】:

我有两个组件 app.js 和 posts.js。

我的 app.js 组件

import React, { createContext, useState } from 'react'
import Posts from './components/Posts'

const val = createContext()

const App = () => {
  const msg = 'hi'

  return (
    <div>
      <val.Provider value={msg}>
        <Posts />
      </val.Provider>
    </div>
  )
}

export default App
export { val }

我的 Posts.js 组件

import React from 'react'
import { val } from '../App'
import { useContext } from 'react'

const Posts = () => {
  const greet = useContext(val)
  return <div>{greet}</div>
}

export default Posts

我想将消息从“hi”更新为从 Posts 组件中说“hello”,但我不知道如何做到这一点,有人可以帮助我理解包括值如何更改的流程吗?一世 谢谢

【问题讨论】:

    标签: javascript reactjs react-state-management context-api


    【解决方案1】:

    msg 需要是状态:

    const App = () => {
      const state = useState('hi')
    
      return (
        <div>
          <val.Provider value={state}>
            <Posts />
          </val.Provider>
        </div>
      )
    }
    

    然后:

    const Posts = () => {
      const [greet,setGreet] = useContext(val)
      return (
        <>
          <div>{greet}</div>
          <button onClick={() => setGreet('hello')}>Change to hello</button>
        </>
      )
    }
    

    将上下文视为您不想继续传递下去的远距离道具会很有帮助。这很有帮助,因为仅此而已。

    使用上下文而不是道具的原因:

    你必须通过很多组件来传递它,其中一些与那个 prop 没有任何关系

    使用上下文的原因:

    您将组件与该上下文紧密耦合。

    由您决定紧密耦合的权衡是否值得。有时他们是,有时他们不是。没有硬性规定。

    【讨论】:

    • 是的,谢谢,
    • 嘿,你能解释一下减速器和动作是如何发挥作用的吗?我浏览了很多资源bt coudn't understand that?
    • 您的代码中没有减速器或操作。不过我猜你说的是useReducer
    • 是的,我在许多教程中看到他们使用减速器动作调度以及上下文它们一起使用的意义是什么你能解释一下流程吗?谢谢。
    • useReducer 只是另一种(redux 风格)管理状态的方式。这就像 useState+1。老实说,我从来不需要使用 useReducer 因为useState 不起作用(而且我写了很多反应)。出于所有意图和目的,当涉及到上下文时,没有区别 - 上下文通常提供一个通常是状态的值(无论该状态来自 useReducer 还是 useState 都无关紧要)和一个更新器(例如来自 useReducer 的调度,或者setX 来自 useState)。这就是您需要知道的全部内容。
    猜你喜欢
    • 2020-11-21
    • 2019-12-04
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2023-04-03
    • 2020-02-04
    • 1970-01-01
    相关资源
    最近更新 更多