MobX - 数据结构之Object

外包流浪者
• 阅读 1385

在MobX里面,对于一个带有prototype的object,MobX并不会默认把它设置为observable。因为MobX认为这是这个对象的构造函数需要去管理的事情。这里,我们有2种方式:
1:在constructor里面使用extendObservable

import {extendObservable, observable} from 'mobx'
import {observer} from 'mobx-react'
import {Component} from 'react'
import React from 'react'
import ReactDom from 'react-dom'
class Rectangle{
  id = Math.random();
  constructor(width, height){
    extendObservable(this, {
      width: width,
      height: height
    })
  }
  increaseWidth = ()=>{
    this.width ++;
  }
}

 @observer class RectangleInfo extends Component {
  render(){
    return (
      <div>
        {
          this.props.rectangles.map((item, index)=>
          <div key={item.id}>
            <div>width: {item.width}</div>
            <button onClick = {item.increaseWidth}> + </button>
          </div>
          )
        }
      </div>
    )
  }
}

let rectangles = observable([new Rectangle(0, 0), new Rectangle(10, 10)]);
const rootElement = document.getElementById('root');
ReactDom.render(<RectangleInfo rectangles = {rectangles}/>, rootElement);

2:在class定义的时候,使用@observable/decorate

import {extendObservable, observable} from 'mobx'
import {observer} from 'mobx-react'
import {Component} from 'react'
import React from 'react'
import ReactDom from 'react-dom'
class Rectangle{
  id = Math.random();
  //没有使用extendObservable,但是使用@observable
  @observable width;
  @observable height;
  constructor(width, height){
    this.width = width;
    this.height = height
  }
  increaseWidth = ()=>{
    this.width ++;
  }
}

 @observer class RectangleInfo extends Component {
  render(){
    return (
      <div>
        {
          this.props.rectangles.map((item, index)=>
                <div key={item.id}>
                    <div>width: {item.width}</div>
                    <button onClick = {item.increaseWidth}> + </button>
                </div>
          )
        }
      </div>
    )
  }
}

let rectangles = observable([new Rectangle(0, 0), new Rectangle(10, 10)]);
const rootElement = document.getElementById('root');
ReactDom.render(<RectangleInfo rectangles = {rectangles}/>, rootElement);

以上就是2种处理带prototype的对象(也就是在class),使得对象成为observable的方法。

点赞
收藏
评论区
推荐文章
GoCoding GoCoding
3年前
React MobX 开始
用于状态管理,简单高效。本文将于React上介绍如何开始,包括了:了解MobX概念从零准备React应用MobXReact.FC写法MobXReact.Component写法可以在线体验:https://ikuokuo.github.io/startreact,代码见:https://github.com/ikuokuo/s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript Object 对象
一、概念JavaScript原生提供Object对象(注意起首的O是大写),介绍该对象原生的各种方法。JavaScript的所有其他对象都继承自Object对象,即那些对象都是Object的实例。二、Object()Object本身是一个函数,可以当作工具方法使用,将任意值转为对象。这个方法常用于保证某个值一定是对象。如果参数为空(或者为undefi
巴拉米 巴拉米
4年前
MobX 上手指南
之前用Redux比较多,一直听说Mobx能让你体验到在React里面写Vue的感觉,今天打算尝试下Mobx是不是真的有写Vue的感觉。题外话在介绍MobX的用法之前,先说点题外话,我们可以看一下MobX的中文简介。在MobX的中文网站上写着:MobX是一个经过战火洗礼的库,它通过透明的函数响应式编程
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
明月 明月
2年前
JS数据类型的几种判断方法
1.typeof(常用)typeof是一个运算符,返回值是一个字符串,用来说明变量的数据类型,可以用来判断number,string,object,boolean,function,undefined,symbol这七种类型.2.instanceof(知道即可)instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上,返回值为布尔值,用于指示一个变量是否属于某个对象的实例3.Object.prototype.to
Kevin501 Kevin501
4年前
Mobx-React:当前最适合React的状态管理工具
MobX_简单、可扩展的状态管理_MobX是由Mendix、Coinbase、Facebook开源和众多个人赞助商(https://cn.mobx.js.org/backers)所赞助的。安装安装: np
可莉 可莉
3年前
23.JavaScript原型和原型链
1.原型:prototype,所有的函数都有一个属性prototype,称之为函数原型默认情况下,prototype是一个普通的Object对象默认情况下,prototype中有一个属性constructor,它也是一个对象,它指向构造函数本身functionTest(){}Test.prototype:函数Test的原型Test.pr
Wesley13 Wesley13
3年前
JS原型、原型链深入理解
原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有”prototype”属性,函数对象有”prototype”属性,原型对象有”constructor”属性。原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有”prototype”属性,函数对象有”prototype”属性,原型对
Stella981 Stella981
3年前
25 个最基本的 JavaScript 面试问题及答案(上)
1.使用typeofbar"object"来确定bar是否是对象的潜在陷阱是什么?如何避免这个陷阱?尽管typeofbar"object"是检查bar是否对象的可靠方法,令人惊讶的是在JavaScript中null也被认为是对象!因此,令大多数开发人员惊讶的是,下面的代码将输出true(而不是f
Stella981 Stella981
3年前
Hooks结合Mobx简单使用
定义和导出Storeimport{action,observable}from"mobx";//定义一个Store:UserclassUser{name'LL';sex'man';@actiongetName