React—组件通信

一、父传子(Props)

父组件可以通过 props 将数据传递给子组件。这是 React 中最常见的一种方式,适用于父子组件之间的数据传递。

    {/* 组件传递:父传子 */}
      {/* 1.父组件传递数据 子组件标签上绑定属性 */}
      {/* 2.子组件接收数据 props(props对象里包含了父组件传递过来的所有数据)的参数 */}
      {/* (1)props可以传递任意数据 */}
      {/* (2)props是只读对象,不能修改,父组件的数据只能父组件修改 */}
    const name='我是要传递给子组件的数据'
<div className="father"> 我是父组件,父传子 <Son name={name} age={18} isTrue={true} list={[1, 3, 6]} obj={{ net: 333 }} cb={() => { // console.log('callback') }} child={<span>4444</span>} > <button>children</button> </Son> </div> function Son(props){ // console.log(props) return <div>子组件,{props.name}{props.children}</div> }

 

二、子传父(callback)

父组件将函数作为 props 传递给子组件,子组件可以通过调用该函数来将数据传递回父组件。这种方式适用于子组件向父组件传递数据或触发父组件中的操作。

    {/* 组件传递:子传父 */}
      {/* 在子组件中调用父组件中的函数并传递实参 */}
      {/* 
        1.父组件中定义函数 (子组件调用并拿到子组件给的参数)
        2.子组件标签绑定方法 (子组件需要绑定父组件定义的函数)
        3.子组件调用父组件的方法传递数据 (父组件通过自己的函数拿到子组件的传递的数据)
      */}
      const [msg,setMsg] = useState('')
      const getMsg = (msg)=>{
        // console.log('获取子组件传递的内容:',msg)
        setMsg(msg)
      }
<div className="father">
        我是父组件,子传父:{msg}
        <Son2 onGetMsg={getMsg}></Son2>
      </div>


function Son2({onGetMsg}){
  // console.log(onGetMsg)
 const string = '子组件要向父组件传递的数据'
  return <div>子组件2 <button onClick={()=>{
    onGetMsg(string)
  }}>子传父</button></div>
}

 

三、兄弟组件(状态提升机制)

{/* 组件传递:兄弟组件通讯 */}
{/* 借助“状态提升”机制,通过父组件进行兄弟组件之间的数据传递 */}
{
/* 1.A组件通过子传父的方式把数据传给父组件APP 2.APP拿到数据后通过父传子的方式再传递给B组件 A -> App -> B */}
  const [nameB,setNameB] = useState('')
  const getAName=(name)=>{
    console.log('A组件传递给父组件的参数:',name)
    setNameB(name)
  }
<div className="father">
     我是APP组件 (父组件) A-》APP-》B
     <A onGetName={getAName}></A>
     <B name={nameB}></B>
  </div>


 function A({onGetName}){
  const name ="我是A组件要传递的数据"
  return <div>
    我是A组件
    <button onClick={()=>{
      onGetName(name)
    }}>A send B</button>
  </div>
}
function B({name}){
  
  return <div>
    我是B组件,{name}
  </div>
}

 

四、跨层级组件(Context)

 {/* 组件传递:跨层通信(使用context机制跨层级组件通信) */}
 {/* 
    1.使用createContext方法创建一个上下文对象
    2.在顶级组件(APP)中通过Ctx.Provider组件提供数据
    3.在底层组件(D)中通过useContext钩子函数获取数据
  */}
  const MsgAppContext = createContext()
   const msgApp = '跨层级传递数据'
<div className="father">
    <MsgAppContext.Provider value={msgApp}>
        我是APP组件 App-》D
        <C></C>
     </MsgAppContext.Provider>
   </div>

function C(){
  return <div>

    我是C组件
    <D></D>
  </div>
}
function D(){
 const msg= useContext(MsgAppContext)
  return <div>

    我是D组件,{msg}
  </div>
}

 

posted on 2024-03-06 12:01  萬事順意  阅读(41)  评论(0编辑  收藏  举报