RN-mobX 简单使用

作者: 精神病患者link常 | 来源:发表于2018-08-30 15:42 被阅读412次

https://cn.mobx.js.org

本文问题解决

1.单个页面的数据存放、修改、即时更新
2.全局数据的存放、修改、即时更新

❗️思考题:

1.每个页面都有一个确定的store,里面进行属性声明、方法声明,将网络请求及所有处理数据的方法都写在store里面,页面进行调用。页面只负责得到数据、显示数据,逻辑都写在store里面。

2.全局确定一个store,一级模块可确定一个store,最后进行合并(参考redux的合并),通过inject传递给各个页面。页面可通过调用store的方法进行修改全局的store。

一、安装

yarn add mobx --save
yarn add mobx-react --save
yarn add babel-plugin-syntax-decorators --save
yarn add babel-plugin-transform-decorators-legacy --save

.babelrc 文件配置 babel 插件

{
  "presets": [
    "react-native", 
  ],
  'plugins': [
    'syntax-decorators',
    'transform-decorators-legacy'
  ]
}

二、单个页面的数据存放、修改(无需this.state = {...}this.setState({...}))


import React, {Component} from 'react';
import {StyleSheet, Text, View, TextInput} from 'react-native';

import {observable, configure, toJS} from 'mobx'
import {observer} from 'mobx-react'

// 是否采用严格模式
configure({ enforceActions: "observed" }) //false==>"never"  true==>"observed"  strict==>"always"

// 本页数据源
const myStore = observable({
  userName: "尼古拉斯",
  userAge: 18,
  userSex: 0, // 0 男  1 女

  /**
   * 修改年龄
   * age 要修改的年龄
   */
  changeUserAge(age) {
    this.userAge = age;
  },
  /**
   * 修改姓名
   * age 要修改的年龄
   */
  changeUserName(name) {
    this.userName = name;
  }
},{
  changeUserName: action,
  changeUserAge: action
})

@observer
export default class App extends Component {
  componentDidMount(){
    console.log('myStore: ', toJS(myStore));
  }
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>Welcome to React Native!</Text>
                <Text>userName: {myStore.userName}</Text>
                <Text>userPsd: {myStore.userPsd}</Text>

                <View style={{flexDirection: "row", marginTop: 20}}>
                    <Text style={{width: 100}}>你的名字:</Text>
                    <TextInput value={String(myStore.userName)} onChangeText={(value)=>{
                        // 调用方法直接修改姓名
                        myStore.changeUserName(value);
                    }}/>
                </View>
      </View>
    );
  }
}

三、全局数据的存放、修改、即时更新

使用Provider

/** @format */

import {AppRegistry} from 'react-native';
import App from './App';
import AppState from './AppState';

import {name as appName} from './app.json';
import React, {Component} from 'react';
import {Provider} from 'mobx-react';
import {observable, extendObservable, action, decorate, runInAction} from 'mobx'
import {inject, observer} from 'mobx-react'


class RootStore {
  constructor() {
    this.userStore = new UserStore(this)
    this.todoStore = new TodoStore(this)


    // 给 userStore 添加  observable 的属性
    extendObservable(this.userStore, {
      userName: '尼古拉斯-root',
      userAge: '18-root',
      userSex: '男-root'
    });


    // 给 todoStore 添加  observable 的属性
    extendObservable(this.todoStore, {
      todoList: [
        "吃饭",
        "睡觉",
        "看书"
      ]
    });
  }
}

class UserStore {
  constructor(rootStore) {
    this.rootStore = rootStore
  }
  // 修改用户名
  changeRootUserName(name){
    //  runInAction  在这里面写 可以修改 observable 修饰的变量
    runInAction(()=>{
      this.userName += name
    })
  }
}



class TodoStore {
  constructor(rootStore) {
    this.rootStore = rootStore
  }
  // 修改list
  changeTodoList(list){
    //  runInAction  在这里面写 可以修改 observable 修饰的变量
    runInAction(()=>{
      this.todoList = list
    })
  }
}

const colors = observable({
  foreground: '#000',
  background: '#fff'
});


const rootStore = new RootStore();

class Root extends Component {
    render() {
      console.log('rootStore=====', rootStore)
        return (
          // 可以添加其他的属性
          <Provider rootStore={rootStore} colors={colors}>
            <App />
          </Provider>
        );
    }
}


AppRegistry.registerComponent(appName, () => Root);

// 通过 inject 获取传递过来的store,inject("rootStore","colors",......)
// 注意: 从 mobx-react 4开始,注入 stores 的语法发生了变化,应该一直使用 inject(stores)(component) 或 @inject(stores) class Component...。 直接传递 store 名称给 observer 的方式已废弃。

 const App = inject("rootStore","colors")(observer(class App extends Component {

  componentDidMount(){
    console.log('myStore: ', toJS(myStore));
    console.log('this.props.rootStore: ', toJS(this.props.rootStore));
    console.log('this.props.colors: ', toJS(this.props.colors));

  }
  
  render() {
    return (
      <View style={styles.container}>
        <View>
          // 获取 全局的变量
          <Text>rootName: {this.props.rootStore.userStore.userName}</Text>

          {
            this.props.rootStore.todoStore.todoList.map((value, index)=>{
              return <Text key={index}>todo: {value}</Text>
            })
        }

          <AppUserNameItem data={myStore.userName} store={myStore}/>
          <AppUserAgeItem data={myStore.userAge} store={myStore}/>
          <TouchableOpacity onPress={()=>{


            // 直接修改全局的变量
            this.props.rootStore.userStore.changeRootUserName('123')


          }}>
            <Text>点击修改rootUserNmae</Text>
          </TouchableOpacity>
          <TouchableOpacity onPress={()=>{


            // 直接修改全局的变量
            this.props.rootStore.todoStore.changeTodoList(['玩游戏','聊天','逛街','唱歌'])


          }}>
            <Text>点击修改TodoList</Text>
          </TouchableOpacity>
        </View>
      </View>
    );
  }
}))

❌(不会解决🙄)使用@observable会出现
error: bundling failed: TypeError: Property right of AssignmentExpression expected node to be of a type ["Expression"] but instead got null

image.png

相关文章

  • RN-mobX 简单使用

    https://cn.mobx.js.org 本文问题解决1.单个页面的数据存放、修改、即时更新2.全局数据的存放...

  • 简单使用

    创建模型 过滤器 我们有一些字段和我们想让用户筛选的基础上 名称、价格或release_date。 我们创建一个 ...

  • gorange

    数组中简单使用 map中简单使用

  • 简单使用使用kaggle

    向我这样的条件不好的可以考虑借助云gpu来加速训练,借助kaggle可以在kaggle服务器上训练数据,kaggl...

  • 零碎的小程序笔记

    目录 template的简单使用WXS的简单使用npm的简单使用倒计时js的实现wx:for的使用一些js方法记录...

  • 命令行的简单使用

    Git命令行的简单使用,仅供自己使用 pod命令行的简单使用

  • 单元测试和OCMock

    OCMock使用一、安装及简单使用:使用Cocoapod引入:pod 'OCMock' 简单使用:新建一个单元测试...

  • Alamofire类似AFNetworking的简单使用和封装

    简单的使用。简单的使用。简单的使用。注定该文弱鸡一个,求拍砖。 一、介绍 Alamofire(Swift)的前身是...

  • Android ViewPager 使用总结

    ViewPager 简单使用 ViewPager + PagerAdapter简单的 View 可以使用这个实现,...

  • vuex简单简单使用记录

    1、Vuex有啥用(非官方解释)举例,组件a b 使用了同一个数据源count,当操作a的时候count++,同时...

网友评论

  • Caesar王:楼主,你文章最后那个问题解决了吗
    Caesar王:@精神病患者link常 就是你最后说的这个问题: error: bundling failed: TypeError: Property right of AssignmentExpression expected node to be of a type ["Expression"] but instead got null
    精神病患者link常:@Caesar王 什么版本问题?是不是最新的版本不支持@了?
    Caesar王:啊,我解决了,是由于版本问题

本文标题:RN-mobX 简单使用

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