1. 父组件给子组件传值【props】

父组件传给子组件, 子组件通过this.props获取父组件传递过来的数据

  1. <Person personData={personData} addPerson={addPerson} />

2. 子组件修改父组件的值

父组件可以把修改值的方法传递给子组件, 子组件可以调用父组件的方法, 然后修改父组件的值。

  1. class App extends Component {
  2. state = {
  3. count:10
  4. }
  5. add = () =>{
  6. this.setState(state =>({ count: state.count + 1}))}
  7. render() {
  8. const { count} = this.state;
  9. return (
  10. <div className='parent'>
  11. <h2>我是APP组件</h2>
  12. <h3>count当前的值是:{count}</h3>
  13. <button type="button" onClick={this.add}>+</button>
  14. <hr/>
  15. <Child add={this.add} count={count}/>
  16. </div>
  17. );
  18. }
  19. }
  20. class Child extends Component {
  21. render() {
  22. return (
  23. <div className='child'>
  24. <h2>我是Child组件</h2>
  25. <h3>count当前的值是:{this.props.count}</h3>
  26. <button onClick={this.props.add}>修改父组件的值</button>
  27. </div>
  28. );
  29. }
  30. }
  31. export default App;

3. createContext

一种组件间通信方式, 常用于【祖组件】与【后代组件】间通信。

3.1 使用方式

使用方式:

  1. //创建context容器对象
  2. const XxxContext = React.createContext()
  3. //渲染子组时,外面包裹xxxContext.Provider, 通过value属性给后代组件传递数据:
  4. <xxxContext.Provider value={数据}>
  5. 子组件
  6. </xxxContext.Provider>

3.2 类组件后代组件读取数据

  • static contextType = xxxContext // 声明接收context
  • this.context // 读取context中的value数据
    1. import React, { Component, createContext } from 'react';
    2. import './components/style.css'
    3. const myContext = createContext()
    4. const { Provider} = myContext
    5. class App extends Component {
    6. state = {
    7. name :'Iric',
    8. age:23
    9. }
    10. render() {
    11. const {name, age} = this.state;
    12. return (
    13. <div className='parent'>
    14. <h2>我是APP组件</h2>
    15. <hr/>
    16. <Provider value={{name, age}}>
    17. <Child />
    18. </Provider>
    19. </div>
    20. );
    21. }
    22. }
    23. class Child extends Component {
    24. render() {
    25. return (
    26. <div className='child'>
    27. <h2>我是Child组件</h2>
    28. <hr/>
    29. <Son/>
    30. </div>
    31. );
    32. }
    33. }
    34. class Son extends Component {
    35. static contextType = myContext
    36. render() {
    37. console.log(this.context)
    38. const {name, age} = this.context
    39. return (
    40. <div className='son'>
    41. <h2>我是Son组件</h2>
    42. <p>姓名:{name}</p>
    43. <p>年龄:{age}</p>
    44. </div>
    45. );
    46. }
    47. }
    48. export default App;

    3.3 函数组件后代组件读取数据

    1. <xxxContext.Consumer>
    2. {
    3. value => ( // value就是context中的value数据
    4. 要显示的内容
    5. )
    6. }
    7. </xxxContext.Consumer>
    1. import React, { Component, createContext } from 'react';
    2. import './components/style.css'
    3. const myContext = createContext()
    4. const { Provider,Consumer} = myContext
    5. class App extends Component {
    6. state = {
    7. name :'Iric',
    8. age:23
    9. }
    10. render() {
    11. const {name, age} = this.state;
    12. return (
    13. <div className='parent'>
    14. <h2>我是APP组件</h2>
    15. <hr/>
    16. <Provider value={{name, age}}>
    17. <Child />
    18. </Provider>
    19. </div>
    20. );
    21. }
    22. }
    23. class Child extends Component {
    24. render() {
    25. return (
    26. <div className='child'>
    27. <h2>我是Child组件</h2>
    28. <hr/>
    29. <Son/>
    30. </div>
    31. );
    32. }
    33. }
    34. function Son(){
    35. return <div className='son'>
    36. <h2>我是Son组件</h2>
    37. <Consumer>
    38. {
    39. value => {
    40. console.log(value); //{name: 'Iric', age: 23}
    41. return <p>从A组件传过来的名字是:{value.name}, 年龄是:{value.age}</p>
    42. }
    43. }
    44. </Consumer>
    45. </div>
    46. }
    47. export default App;

    4. 消息的发布订阅pubsub

    使用Pubsub.publish(‘saveEditScoreCard’,data)接收两个参数,第一个是要发送的消息,让订阅,第二个是传输的数据。 ```javascript // AddButton组件 import React from ‘react’ import PubSub from “pubsub-js” class AddButton extends React.Component { constructor(props) {
    1. super(props);
    2. this.state = { };
    } add = () => {
    1. //发布消息
    2. PubSub.publish("addObj",{name:'haha', age:15})
    } render() {
    1. return (
    2. <button onClick={this.add}>添加数据</button>
    3. );
    } }

export default AddButton;

// List组件 import React from ‘react’; import PubSub from “pubsub-js” class List extends React.Component { constructor(props) { super(props); this.state = {
list:[ {name:”iric”, age:23}, {name:”lisa”, age:25}, {name:”monke”, age:17}, {name:”momoko”, age:33}, ] }; } componentDidMount(){ //订阅消息 this.token = PubSub.subscribe(“addObj”, (msg,data)=> { console.log(msg,data) const res = this.state.list; this.setState({ list:[data,…res] }) }) } componentWillUnmount(){ // 取消订阅 PubSub.unsubscribe(token) } render() { const {list} = this.state; return (

    { list.map((item, index) => { return
  • {item.name}
  • }) }
); } }

export default List;

  1. <a name="su7Dn"></a>
  2. # 5. React-redux
  3. react-redux是运用Provider将组件和store对接,使在Provider里的所有组件都能共享store里的数据,还要使用connect将组件和react连接。
  4. ```javascript
  5. const mapStateToprops = (state) => {
  6. console.log(state)
  7. return {
  8. sum: state
  9. }
  10. }
  11. const mapDispatchToProps = dispatch => {
  12. return {
  13. increment: data => dispatch(incremnet(data)),
  14. decrement : data => dispatch(decrement(data))
  15. }
  16. }
  17. //使用connect创建并暴露一个CountContainer容器组件
  18. export default connect(mapStateToprops,mapDispatchToProps)(CountContainer)

6. 组件间的关系

  • 父子组件
  • 兄弟组件(非嵌套组件)
  • 祖孙组件(跨级组件)

    7. 几种通信方式

    1.props:
    (1).children props
    (2).render props
    2.消息订阅-发布:
    pubs-sub、event等等
    3.集中式管理:
    redux、dva等等
    4.conText:
    生产者-消费者模式

    8. 比较好的搭配方式:

  • 父子组件:props

  • 兄弟组件:消息订阅-发布、集中式管理
  • 祖孙组件(跨级组件):消息订阅-发布、集中式管理、conText(开发用的少,封装插件用的多)