<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
父傳子:通過自定義屬性向子元件傳值,值可以是任何型別
子傳父:通過父元件把方法傳給子元件,子元件呼叫傳過去的方法完成傳值
注:
1.定義方法時儘可能的去使用箭頭函數定義
2.呼叫時,儘可能的寫小括號
父元件中的方法 // 成員方法 箭頭函數來定義,這樣就沒有this指向問題 setNum = (n = 1) => this.setState(state => ({ num: state.num + n })) <Child num={num} setNum={this.setNum} /> 子元件中 <button onClick={() => setNum(2)}>+++++</button> 子去修改父傳過來的資料,props它是單向資料流,子不能直接去修改
this.childRef.current
得到當前Child元件的範例物件childRef = createRef() <Child ref={this.childRef} /> ++++++++++++++++++++++++++++++++ this.setState({ title: this.childRef.current.state.title }) this.childRef.current.setState({ title: this.state.msg }) this.childRef.current.setTitle(this.state.msg)
此方案用來解決兄弟元件間的傳值問題,就是把共用的狀態資訊提升到父元件狀態中。
import React, { Component } from 'react' class Child1 extends Component { render() { let { setMsg } = this.props return ( <div> <input type="text" onChange={e => setMsg(e.target.value)} /> </div> ) } } class Child2 extends Component { render() { let { msg } = this.props return ( <div> <h3>{msg}</h3> </div> ) } } class App extends Component { state = { msg: '' } setMsg = msg => this.setState({ msg }) render() { return ( <div> <h1>{this.state.msg}</h1> <Child1 setMsg={this.setMsg} /> <Child2 msg={this.state.msg} /> </div> ) } } export default App
或者:
class App extends Component { state = { msg: '', setMsg: msg => this.setState({ msg }) } render() { let { msg, setMsg } = this.state return ( <div> <h1>{msg}</h1> {/* <Child1 setMsg={setMsg} /> */} {/* <Child2 msg={msg} /> */} <Child1 {...this.state} /> <Child2 {...this.state} /> </div> ) } }
context實現在跨元件通訊,一般用於自定義元件
import { createConext } from 'react' const ctx = createContext() const { Provider, Consumer } = ctx export { ctx as default, Provider, Consumer }
匯入
在App元件中生產資料,這樣下面的子孫元件就可以呼叫此context
物件來消費資料,value屬性就是生產的資料來源
app.jsx
import Child from './pages/Child' import { Provider } from './context/appContext' class App extends Component { state = { name: "張三", setName: (name) => this.setState({ name }), }; ======================================================= render() { return ( <div> {/* value屬性就是生產的資料來源 */} <Provider value={this.state}> <Child /> </Provider> </div> ); } }
child.jsx檔案
兩種方法來消費(獲取)資料
類元件中context還可以換一個方案來消費,定義好後,就可以通過成員屬性 this.context來獲取資料
方式1:通過元件消費:
由於Consumer的特性,裡面的程式碼必須是這個函數的返回值。
// 假設現在當前元件是App元件下面的很深的子孫元件 import ctx, { Consumer } from '../../context/appContext' ..... <Consumer>{state => <h3>{state.name}</h3>}</Consumer>
方式2:通過繫結靜成屬性來消費
首先用static 來宣告contextType
static contextType = ctx
這樣在執行是就會獲得一個新的屬性,我們來接收它,這樣consumer就可以完全不再使用了。
const battery = this.context
// 假設現在當前元件是App元件下面的很深的子孫元件 import ctx, { Consumer } from '../../context/appContext' static contextType = ctx const battery = this.context //就可以通過成員屬性 this.context來獲取資料 ..... <h3>{this.context.name}</h3> <h3>{battery.name}</h3>
到此這篇關於React元件間傳值及跨元件通訊詳解的文章就介紹到這了,更多相關React元件間傳值內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45