标签: mobx-react

对于可观察字段,"对象可能未定义"

检索数据并设置obseravble数组,这里的代码如下:

import {observable} from 'mobx';

export interface IMenuModel{
    Id:number
    itemName:string;
    parentId?:number;    
}
 class MenuRepo {
    @observable menuItems? : IMenuModel[];
    constructor(){
    }
    getItems():void {
    fetch(`..`).then((response: Response): Promise<{ value:IMenuModel[] }>  => {
              return response.json();
            })
             .then((response: { value: IMenuModel[] }) : void => {
               this.menuItems = response.value;

      }, (error: any): void => {
        //exception handling
      });
    }
}

var menuCodes = new MenuRepo
export default menuCodes;
Run Code Online (Sandbox Code Playgroud)

这是观察者阶级;

import * as React from 'react';
import {observer} from 'mobx-react';
import {IMenuModel} from './Codes';

@observer …
Run Code Online (Sandbox Code Playgroud)

typescript reactjs mobx mobx-react

4
推荐指数
1
解决办法
3465
查看次数

如何在Mobx + reactjs中使用@Action?

我对如何在代码中使用@action感到困惑。

class Items {

  @observable items= [];

  @action addItem() {
    let newItem= new Item();
    items.push(newItem);
  }
}

@observer
class ItemPage extends Component {

  constructor() {
    super();
  }

  render() {
    const {addItem} = this.props.store;
    return (
      <div className="items">
        <input type="button" value="add" onClick={addItem}/>
      </div>
    )
  }
}

const store = new Items();
Run Code Online (Sandbox Code Playgroud)

javascript reactjs mobx mobx-react

4
推荐指数
1
解决办法
1542
查看次数

如何在mobX中将商店注入另一个商店

我将mobX与React和Meteor结合使用,我需要能够将一个商店中保存的信息用于另一个商店.具体来说,我需要在商店B中引用商店A,以便调用商店A的操作,并通过订阅集合获取它已检索到的信息.我使用了@inject装饰器,但不知道如何调用该动作.谢谢

javascript store meteor mobx mobx-react

4
推荐指数
1
解决办法
4360
查看次数

React组件对Mobx可观察的数据不起作用

我正在将mobX用于我的本地反应项目。请考虑以下商店类别:

class Birds {
    @observable listOne = [];
    @observable fetchingListOne = false;
    @observable fetchErrorOne = '';

    @action setListOne = () => {
        this.fetchingListOne = true;
        api.getList()
            .then((data) => {
                this.listOne.replace(data);
                this.fetchingListOne = false;
            })
            .catch((error) => {
                this.fetchingListOne = false;
                this.fetchErrorOne = error;
            });
    };
}
Run Code Online (Sandbox Code Playgroud)

这是反应成分:

@inject('BirdStore') @observer
export default class Flat extends React.Component {
    componentDidMount() {
        this.props.BirdStore.setListOne();
    }

    _renderHeader = () => {
        return <Text style={styles.listHeaderText}>
            Hello {this.props.BirdStore.listOne.length} is {this.props.BirdStore.fetchingListOne.toString()}
            </Text>;
    };

    _renderItem = ({item}) => …
Run Code Online (Sandbox Code Playgroud)

reactjs react-native mobx mobx-react

4
推荐指数
1
解决办法
932
查看次数

商店'someStore'不可用!确保它是由某个提供商提供的

我正在尝试建立一个新的项目React,Typescript和MobX.

出于某种原因,我无法让MobX工作.这是一段相对简单的代码,但它给了我这个错误.

未捕获的错误:MobX注入器:商店'appState'不可用!确保它是由某个提供商提供的

这是我的代码:

AppState.ts

import {observable} from "mobx"
import {observer} from "mobx-react"

export class AppState {
    @observable public greeting = "hello World"
}
Run Code Online (Sandbox Code Playgroud)

index.tsx

import * as React from "react"
import * as ReactDOM from "react-dom"
import { Provider } from "mobx-react"
import { Router, Route, Switch } from "react-router"
import { createBrowserHistory } from "history"
import MuiThemeProvider from "material-ui/styles/MuiThemeProvider"
"./containers/BookingStep/BookingStepContainer";
import { TestContainer } from "./containers/TestContainer";
import { AppState } from "./store/AppState";

const history = createBrowserHistory()

ReactDOM.render(
  <Provider …
Run Code Online (Sandbox Code Playgroud)

typescript reactjs mobx-react

4
推荐指数
1
解决办法
6081
查看次数

如何在没有装饰器语法的情况下使用mobx反应的“观察者”?

我试图mobx用我的React 360制作一个vr应用程序。我尝试使用装饰器语法,但是在浪费大量时间尝试实现它之后,我决定使用nondecorator语法。这是我遇到问题的mobx文档中遇到的一个示例。这是代码:

import {observer} from "mobx-react";

var timerData = observable({
    secondsPassed: 0
});

setInterval(() => {
    timerData.secondsPassed++;
}, 1000);

@observer class Timer extends React.Component {
    render() {
        return (<span>Seconds passed: { this.props.timerData.secondsPassed } </span> )
    }
};

ReactDOM.render(<Timer timerData={timerData} />, document.body);
Run Code Online (Sandbox Code Playgroud)

注意类observer上的声明Timer。文档指出了这一点。

请注意,使用@observer作为装饰器是可选的,observer(class Timer ... {})实现的效果完全相同。

这是实现的正确方法Timer吗?

observer(class Timer extends React.Component {
  render() {
    return (<span>Seconds passed: { this.props.timerData.secondsPassed } </span> )
  }
}) 
Run Code Online (Sandbox Code Playgroud)

javascript reactjs mobx mobx-react

4
推荐指数
1
解决办法
1822
查看次数

mobx 反应动作绑定

对于那些使用mobx+编写应用程序的人react,我想知道在带有&的 react 组件中使用事件处理程序时是否有更好的方法来处理上下文问题(例如,在商店中this.返回)。undefinedmobxonClickinjectobserver

我一直在写处理程序onClick={actionFromStore.bind(this.props.theStore)}来解决这个问题,但似乎应该有更简洁的方法来做到这一点,我不知道。

我不是 mobx 专家,任何建议将不胜感激!

这里的操作是异步获取请求

reactjs mobx mobx-react

4
推荐指数
2
解决办法
2835
查看次数

为什么 React 组件在用观察者()包装时会渲染两次?

简单地用 包裹 React 组件observer()似乎会导致它们渲染两次。可能的原因是什么?我正在运行最新版本的 react 16.8.3、mobx 5.9.4 和 mobx-react-lite 1.2.0

例如:

import React from "react";
import { observer } from "mobx-react-lite";

const Item = observer(() => {
  return (
    <div>
      {console.log("render item")}
      Item
    </div>
  );
});

export default Item;
Run Code Online (Sandbox Code Playgroud)

这发生在相对复杂的应用程序中。我在调试另一个问题时注意到了这种行为。然后我删除了尽可能多的代码,并能够在一个非常简单的情况下重现该问题。

编辑:请参阅下面的答案。我能够通过尝试使用 codeandbox 进行 repo 来确定问题。

mobx mobx-react

4
推荐指数
1
解决办法
708
查看次数

Mobx-State-Tree-分配给数组类型

我有这个基本模型。

const stuff = types.model({
  term: types.string,
  excludeTerm: types.string,
  stores: types.array(types.string)
}).actions(self => ({
  setTerm(term: string) {
    self.term = term
  },
  setExcludeTerm(term: string) {
    self.excludeTerm = term
  },
  setStores(stores: string[]) {
    self.stores = stores   // <<< the lint error is on this line
  }
}))
Run Code Online (Sandbox Code Playgroud)

我收到以下TS Lint错误:

Type 'string[]' is not assignable to type 'IMSTArray<ISimpleType<string>> & IStateTreeNode<IArrayType<ISimpleType<string>>>'. Type 'string[]' is missing the following properties from type 'IMSTArray<ISimpleType<string>>': spliceWithArray, observe, intercept, clear, and 4 more.ts(2322)

这是一个令人讨厌的错误。我可以这样分配来修复它:(self as any).stores = stores …

typescript tslint mobx mobx-react mobx-state-tree

4
推荐指数
3
解决办法
1300
查看次数

为什么 MobX v6.x 在 React with Typescript 中不能按预期工作?

我目前正在编写一个 React 应用程序,当任何可观察的值发生变化时,它应该能够重新渲染组件。问题是,email如果它发生变化,我将无法重新渲染。

store.ts

export class ExampleStore {
  @observable email = 'hello';

  @action setEmail(email: string) {
    this.email = email;
  }
}
Run Code Online (Sandbox Code Playgroud)

索引.tsx

const stores = {
  exampleStore
};

ReactDOM.render(
  <Provider {...stores}>
    <App />
  </Provider>,
  document.querySelector('#root')
);
Run Code Online (Sandbox Code Playgroud)

应用程序.tsx

interface Props {
  exampleStore?: ExampleStore;
}

@inject('exampleStore')
@observer
export class App extends React.Component<Props, {}> {
  componentDidMount() {
    setInterval(() => {
      this.props.exampleStore!.setEmail(Math.random() * 10 + '');
    }, 2500);
  }

  render() {
    const { email } = this.props.exampleStore!;
    return <div>{email}</div>;
  }
}
Run Code Online (Sandbox Code Playgroud)

我见过很多使用 …

reactjs mobx mobx-react

4
推荐指数
1
解决办法
1638
查看次数