Jon*_*n_B 5 store observable reactjs mobx mobx-react
我已经使用简单的 MobX 商店构建了一个基本的计数器 React 应用程序。我能够使用创建可观察的 MobX 状态,makeObservable但由于某种原因,当我尝试使用时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;
Run Code Online (Sandbox Code Playgroud)
useStore 钩子
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);
};
Run Code Online (Sandbox Code Playgroud)
提供者
import { store, StoreContext } from "./stores";
import Index from "./layout/Index";
function App() {
return (
<StoreContext.Provider value={store}>
<Index />
</StoreContext.Provider>
);
}
export default App;
Run Code Online (Sandbox Code Playgroud)
反应组件
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);
Run Code Online (Sandbox Code Playgroud)
小智 6
您还可以在 makeAutoObservable 的选项中使用 autoBind: true :
constructor(arg) {
makeAutoObservable(this, {}, { autoBind: true });
}
Run Code Online (Sandbox Code Playgroud)
这将自动绑定您的所有操作 - 因此您不会在解构时丢失上下文
它抛出是因为你的方法在调用时丢失了上下文(this)(因为你已经解构了它们)。
它正在工作,makeObservable因为您正在使用action.boundwhich autobinds 方法到实例上下文。
如果您想要相同的功能,则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;
}
}
Run Code Online (Sandbox Code Playgroud)
或者,您也可以使用autoBind以下选项makeAutoObservable:
constructor(arg) {
makeAutoObservable(this, {}, { autoBind: true });
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5361 次 |
| 最近记录: |