React組件傳值

React組件傳值

(一)父傳子

傳遞:在父組件中子組件的標(biāo)簽上目木,給子組件綁定一個(gè)自定義屬性纬朝,值為需要傳遞的數(shù)據(jù)

接收:在子組件內(nèi)部通過props進(jìn)行接收

  • 如何限制外部數(shù)據(jù)的類型

https://react.docschina.org/docs/typechecking-with-proptypes.html

  1. 安裝prop-types
cnpm install prop-types
  1. 引入PorpTypes import ProtoTypes from “prop-types”
  2. 配置

組件名稱.propTypes = {

? 屬性名稱 : PropTypes.類型

}

  • 如何定義外部數(shù)據(jù)的默認(rèn)值

組件名稱.defaultProps = {

? 屬性名稱 : 默認(rèn)值

}

詳見下面案例中的one.js

(二)子傳父

傳遞:在子組件內(nèi)部通過調(diào)用this.props.事件函數(shù)名稱來進(jìn)行傳值

接收:在父組件中子組件的標(biāo)簽上朦促,給子組件綁定一個(gè)自定義屬性痴颊,值為需要傳遞的數(shù)據(jù)

(三)非父子

手動封裝Observer(事件訂閱)

傳值的一方調(diào)用Observer.$emit 樱调,使用Observer.$on接收

  • 組件傳值案例
組件傳值.png
  • index.jsx
import React, { Fragment } from "react";
import One from "./components/one"
import Two from "./components/two"
class App extends React.Component {
    constructor() {
        super();
        this.state = {
            msg: "app組件",
            value: ""
        }
    }
    render() {
        return (
            <div className="app">
                <h2>app組件</h2>
                <h2>接收到子組件的值為:{this.state.value}</h2>
                <One username={this.state.msg} />
                <Two handle={this.handleTwo.bind(this)} />
            </div>
        )
    }
    handleTwo(value) {
        this.setState({
            value
        })
    }
}

export default App;
  • one.js
import React, { Component } from "react"
import Three from "./three"
import PropTypes from "prop-types"
class One extends Component {
    render() {
        let { username } = this.props;
        return (
            <div className="One">One組件
                <h2>接受到父組件的值為:{username}</h2>
                <Three />
            </div>
        )
    }
}

One.proTypes = {
    username:ProTypes.string
}
One.defaultProps = {
    username:"默認(rèn)值"
}

export default One
  • two.js
import React, { Component } from "react"
import Observer from "../observer"
class Two extends Component {
    constructor() {
        super();
        this.state = {
            threeVal: ""
        }
        Observer.$on("handle", (value) => {
            this.setState({
                threeVal: value
            })
        })
    }
    render() {
        return (
            <div className="Two">
                Two組件
                <h2>接收到three組件的值為:{this.state.threeVal}</h2>
                <button onClick={this.handleAdd.bind(this)}>點(diǎn)擊發(fā)送給父組件</button>
            </div>
        )
    }
    handleAdd() {
        this.props.handle('two組件')
    }
}

export default Two
  • three.js
import React, { Component } from "react"
import Observer from "../observer"
class Three extends Component {
    render() {
        console.log(1, this)
        return (
            <div className="three">
                three組件
            <button onClick={this.handleSend.bind(this)}>發(fā)送到two組件</button>
            </div>
        )
    }
    handleSend() {
        Observer.$emit("handle", "three組件");
    }
}

export default Three

(四)context

Provider-Consumer跨組件傳值,相當(dāng)于vue中的provide/reject

通過context創(chuàng)建一個(gè)生產(chǎn)者作為父級洽故,再創(chuàng)建一個(gè)消費(fèi)者組件作為子級使用贝攒。

  • Consumer必須要有一個(gè)函數(shù),返回一個(gè)jsx語法
Provider-Consumer.png
  • createContext.js
import React, { createContext } from "react";
export let { Provider, Consumer } = createContext();
  • index.jsx
import React, { Fragment } from "react";
import One from "./components/one"
import { Provider } from "./createContext"
class App extends React.Component {

    render() {
        return (
            <Provider
                value={{
                    username: "lxc",
                    age: 18
                }}
            >
                <div className="app">
                    app組件
                    <One />
                </div>
            </Provider>
        )
    }
}

export default App;
  • two.jsx
import React, { Component } from "react"
import { Consumer } from "../createContext"
class Two extends Component {
    render() {
        return (
            <Consumer>
                {
                    (props) => {
                        return (
                            <div className="Two">
                                two組件
                                <h2>接收app組件傳值username:{props.username}                                  </h2>
                            </div>
                        )
                    }
                }
            </Consumer>
        )
    }
}

export default Two
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末时甚,一起剝皮案震驚了整個(gè)濱河市隘弊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撞秋,老刑警劉巖长捧,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吻贿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)哑子,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門舅列,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卧蜓,你說我怎么就攤上這事帐要。” “怎么了弥奸?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵榨惠,是天一觀的道長。 經(jīng)常有香客問我盛霎,道長赠橙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任愤炸,我火速辦了婚禮期揪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘规个。我一直安慰自己凤薛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布诞仓。 她就那樣靜靜地躺著缤苫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪墅拭。 梳的紋絲不亂的頭發(fā)上活玲,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼翼虫。 笑死屑柔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的珍剑。 我是一名探鬼主播掸宛,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼招拙!你這毒婦竟也來了唧瘾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤别凤,失蹤者是張志新(化名)和其女友劉穎饰序,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體规哪,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡求豫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诉稍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝠嘉。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杯巨,靈堂內(nèi)的尸體忽然破棺而出蚤告,到底是詐尸還是另有隱情,我是刑警寧澤服爷,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布杜恰,位于F島的核電站,受9級特大地震影響仍源,放射性物質(zhì)發(fā)生泄漏心褐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一镜会、第九天 我趴在偏房一處隱蔽的房頂上張望檬寂。 院中可真熱鬧,春花似錦戳表、人聲如沸桶至。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镣屹。三九已至,卻和暖如春价涝,著一層夾襖步出監(jiān)牢的瞬間女蜈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伪窖,地道東北人逸寓。 一個(gè)月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像覆山,于是被迫代替她去往敵國和親竹伸。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 在前一章中我們已經(jīng)感受到完全用React來管理應(yīng)用數(shù)據(jù)的麻煩簇宽,在這一章中勋篓,我們將介紹Redux這種管理應(yīng)用...
    六個(gè)周閱讀 967評論 0 8
  • 前言 強(qiáng)烈推薦的學(xué)習(xí)資源:《深入淺出React和Redux》 此篇學(xué)習(xí)筆記記錄了對書中第三章節(jié)的學(xué)習(xí)心得在學(xué)...
    ccminn閱讀 7,438評論 3 5
  • ##Flux與面向組件化開發(fā)首先要明確的是,F(xiàn)lux并不是一個(gè)前端框架魏割,而是前端的一個(gè)設(shè)計(jì)模式譬嚣,其把前端的一個(gè)交互...
    吳小蛆閱讀 308評論 0 0
  • React 中 keys 的作用是什么? Keys 是 React 用于追蹤哪些列表中元素被修改钞它、被添加或者被移除...
    e2ee31170666閱讀 1,292評論 1 3
  • 去年翻譯的flux官方文檔對flux架構(gòu)的描述拜银,覺得最近很多朋友開始react編程了,所以我覺得有必要拿出來這篇水...
    余歌_非魚閱讀 2,523評論 0 9