组件通信

  1. props
  2. context
  3. redux mobox
    任意组件间的数据通信

### mobx

会有一个独自的js文件进行治理
父组件 数据注入 Provider

子组件 (任意组件)

  1. 装置
    yarn add mobx
    npm install mobx --save

    1. 有一个包

父级的入口治理

  1. 引入 mobx-react 应用Provider
  2. 引入store.js 中的文件 (可能是多个)
    new Store()

    增加 - 引入一个新的store

    • stores={

    newStore:new NewStore(),
    }

  3. 应用Provider 注入 { ...stores }

### 报错

因为mobx 不反对@语法所以会报错
// import {observable, computed, action} from 'mobx';3 | class Store {> 4 |   @observable tradeCfg = {  |   ^5 |     'sadf': 'sadf'6 |   };7 |   @observable baseInfo = {};<!-- 解决方案:  yarn add @babel/plugin-proposal-decorators  yarn add @babel/plugin-proposal-class-properties -->
  1. 解决办法

    -  1:

    yarn add @babel/plugin-proposal-decorators
    yarn add @babel/plugin-proposal-class-properties

    -  2:在package.json中 找到 babel下的  presets 替换代码
          "presets": [        ["react-app"],        ["@babel/preset-react"]    ],    "plugins": [        ["@babel/plugin-proposal-decorators", {"legacy": true }],        ["@babel/plugin-proposal-class-properties", { "loose" : true }]    ]

如何在页面中读取 mobx 数据

  1. 类组件
    须要的子页面应用

    1. import { withRouter } from 'react-router-dom';//1. 引入
    2. import { observer,inject } from 'mobx-react';

    在类组件的下面

    // 1.引入须要的模块  import { withRouter } from 'react-router-dom';//1. 引入  import { observer, inject } from 'mobx-react';//2.应用引入的模块  @withRouter  @inject('FirstStore',)//多个之前须要,号隔开  @observer
    1. 从this.props上解构应用
  2. 函数组件

    应用时父级的入口治理不变;

子组件应用 读取值;

  1. import { withRouter } from 'react-router-dom'; //用来连贯router更新数据的
  2. import { observer, MobXProviderContext } from 'mobx-react';// 用来
  3. function useStores(name) {

    return React.useContext(MobXProviderContext)[name]}===  下面办法等价于上面的这个react.useContext(MobXProviderContext).FirstStore;
  1. 导出时先试用 observable()包裹组件,而后再用WithRouter在包裹

    export default withRouter(observable( View ))

mobx 文档解构

mobx 步骤
<!--
1.引入mobx
  1. 定义一个Class类 在里面调用
  2. 应用 observable 来定义 数据
  3. 应用 observer 与页面进行关联
  4. 应用 action 批改咱们的数据

【ovserver】 页面中进行 读取,批改 的操作

定义state () 相当于state 定义根底数据类型 与 复合数据类型
-->

  // mobx 文件解构  import { observable, computed, action, autorun, runInAction, makeObservable } from 'mobx'  // 有一个类   class Store{    @obserbable  name='小张'; //用 @obserbable 来定义数据  【根本数据类型,复合数据类型】    @action  //应用 @action 来定义方法       fn=(text)=>{        this.name=text      }  }export default Store;

在页面上批改mobx 的数据

类组件 批改mobx
import { observer,inject } from 'mobx-react';@withRouter@inject('FirstStore','SecondStore')//多个之前须要,号隔开@observerclass View extends Component {     static contextType = DataContext;   render() {     console.log('assssssssssss', this.props)     const { FirstStore,SecondStore } = this.props// 读取办法    //  console.log(FirstStore,'aaaaaaaaaaaaaaaaaaaaaaaa')     this.props.SecondStore.fn()     const { fn, name } = this.props.SecondStore;//从你生成的实例对象中【SecondStore】解构store.js中你应用action定义方法,    return (      <div>              {fn('狗狗萌')}         {name}        <button onClick={()=>{fn('小琪')}}>safdsf </button>         //调用actions定义的办法来批改 observable 的值       {FirstStore}       </div>    )  }}export default View

在批改值的过程中会发现 打印的数据批改了然而页面上的数据并没有扭转

解决方案 store.js中退出
constructor() {
  makeObservable(this);}
import { observable, computed, action, autorun, runInAction, makeObservable } from 'mobx';class Store { @observable name = '小张' constructor() {   makeObservable(this);//解决了打印内容批改 , 然而页面为扭转内容的为扭转 } // 办法一 makeObservable(this) // 办法二  @action.bound @action//.bound //用来申明的函数 fn = (text) => {   this.name = text }}export default Store;