Mobx makeAutoObservable 不绑定这个

问题描述 投票:0回答:3

我用一个简单的 MobX 商店构建了一个基本的计数器 React 应用程序。我能够使用

makeObservable
创建可观察的 MobX 状态,但由于某种原因,当我尝试使用
makeAutoObservable
时,我收到错误

Cannot read property 'counter' of undefined

我如何错误地使用

makeAutoObservable

商店

import { makeAutoObservable, makeObservable, action, observable } from "mobx";

class SampleStore {
  counter = 0;

  constructor(arg) {
    makeAutoObservable(this);
    // makeObservable(this, {
    //   counter: observable,
    //   increment: action.bound,
    //   decrement: action.bound,
    // });
  }

  increment() {
    this.counter++;
    return this.counter;
  }

  decrement() {
    this.counter--;
    return this.counter;
  }
}

export default SampleStore;

使用Store钩子

import { createContext, useContext } from "react";

import SampleStore from "./SampleStore";

export const store = {
  sampleStore: new SampleStore(),
};

export const StoreContext = createContext(store);

export const useStore = () => {
  return useContext(StoreContext);
};

提供商

import { store, StoreContext } from "./stores";
import Index from "./layout/Index";

function App() {
  return (
    <StoreContext.Provider value={store}>
      <Index />
    </StoreContext.Provider>
  );
}

export default App;

反应组件

import { useStore } from "../stores";
import { observer } from "mobx-react";

const Index = (props) => {
  const store = useStore();
  const {
    sampleStore: { counter, increment, decrement },
  } = store;
  return (
    <>
      <h1>MobX and React.js example</h1>
      <p>{counter}</p>
      <button onClick={increment}>+</button>
      <button onClick={decrement}>-</button>
    </>
  );
};

export default observer(Index);

reactjs observable store mobx mobx-react
3个回答
6
投票

您还可以在 makeAutoObservable 的选项中使用 autoBind: true:

constructor(arg) {
  makeAutoObservable(this, {}, { autoBind: true });
}

这将自动绑定您的所有操作 - 因此您不会在解构时丢失上下文


4
投票

它抛出是因为你的方法在调用时丢失了上下文(

this
)(因为你已经解构了它们)。

它正在与

makeObservable
一起使用,因为您正在使用
action.bound
,它将方法自动绑定到实例上下文。

如果您想要与

makeAutoObservable
相同的功能,您需要使用箭头功能,如下所示:

class SampleStore {
  counter = 0;

  constructor(arg) {
    makeAutoObservable(this);
  }

  // Make it arrow function
  increment = () => {
    this.counter++;
    return this.counter;
  }
  
  // Make it arrow function
  decrement = () => {
    this.counter--;
    return this.counter;
  }
}

或者,您也可以使用

autoBind
选项来
makeAutoObservable
:

constructor(arg) {
  makeAutoObservable(this, {}, { autoBind: true });
}

0
投票

尽量不要那样破坏商店。 解构时,任何原始变量将保持最新值并且不再可观察。 您还需要

bind
点击方法返回商店。

import { useStore } from "../stores";
import { observer } from "mobx-react";

const Index = (props) => {
  const {sampleStore:store} = useStore();

  return (
    <>
      <h1>MobX and React.js example</h1>
      <p>{store.counter}</p>
      <button onClick={store.increment.bind(store)}>+</button>
      <button onClick={store.decrement.bind(store)}>-</button>
    </>
  );
};

export default observer(Index);
© www.soinside.com 2019 - 2024. All rights reserved.