美文网首页
React组件传值

React组件传值

作者: learninginto | 来源:发表于2020-03-11 22:06 被阅读0次

React组件传值

(一)父传子

传递:在父组件中子组件的标签上,给子组件绑定一个自定义属性,值为需要传递的数据

接收:在子组件内部通过props进行接收

  • 如何限制外部数据的类型

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.类型

}

  • 如何定义外部数据的默认值

组件名称.defaultProps = {

​ 属性名称 : 默认值

}

详见下面案例中的one.js

(二)子传父

传递:在子组件内部通过调用this.props.事件函数名称来进行传值

接收:在父组件中子组件的标签上,给子组件绑定一个自定义属性,值为需要传递的数据

(三)非父子

手动封装Observer(事件订阅)

传值的一方调用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:"默认值"
}

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)}>点击发送给父组件</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)}>发送到two组件</button>
            </div>
        )
    }
    handleSend() {
        Observer.$emit("handle", "three组件");
    }
}

export default Three

(四)context

Provider-Consumer跨组件传值,相当于vue中的provide/reject

通过context创建一个生产者作为父级,再创建一个消费者组件作为子级使用。

  • Consumer必须要有一个函数,返回一个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

相关文章

  • react子组件向父组件传值

    相关资料:react 父组件怎么获取子组件的这个值React组件间信息传递方式react同级组件之间传值 • 父...

  • react-父子组件间通信

    React-父子组件间通信 父组件传 值 给子组件, 传 方法 给子组件 子组件接收 值 ,触发父组件的 方法

  • Props、State

    Props属性实现组件传值 Props是properties的简写。通过Props可以组件传值如下例子 React...

  • Vue和React组件通信的总结

    在现代的三大框架中,其中两个Vue和React框架,组件间传值方式有哪些? 组件间的传值方式 组件的传值场景无外乎...

  • react 父子组件传值(兄弟传值)

    react中父子组件传值 父向子: 父组件通过自定义属性向子组件传值,子组件通过this.props.属性名接收子...

  • React入门(二)组件

    本节知识点 (1)React组件化 (2)React父子组件传值 (一)组件 在React中组件都是对应的一个个类...

  • react-native 父子组件之间传值

    1.父组件传值给子组件 父组件给子组件传值 react 和vue都是很相似的 , 很简单 1.父组件引入子组件im...

  • 学习react的第二天(1)

    react组件传值 为了防止数据乱流,react规定,不借助外力,只支持父子传值 父 -> 子 1. 在父元素中,...

  • vue、react对比

    一、父子通信 1. 父组件通过props向子组件传值 vue:父组件 子组件接收 react:父组件: 子组件: ...

  • react 组件之间通讯传值的多种方法实现

    react组件传值,大概有下面几种方法: props context redux react-router 路由切...

网友评论

      本文标题:React组件传值

      本文链接:https://www.haomeiwen.com/subject/jljkjhtx.html