gpt4 book ai didi

reactjs - Mobx makeAutoObservable 没有绑定(bind)这个

转载 作者:行者123 更新时间:2023-12-05 01:58:44 26 4
gpt4 key购买 nike

我用一个简单的 MobX 商店构建了一个基本的计数器 React 应用程序。我能够使用 makeObservable 创建可观察的 MobX 状态,但由于某些原因,当我尝试使用 makeAutoObservable 时出现错误

无法读取未定义的属性“counter”

我如何错误地使用 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钩子(Hook)

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;

react 组件

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);

最佳答案

它抛出是因为您的方法在调用时丢失了上下文 (this)(因为您已经解构了它们)。

它与 makeObservable 一起工作,因为您使用的是 action.bound,它会将方法自动绑定(bind)到实例上下文。

如果你想要与 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;
}
}

关于reactjs - Mobx makeAutoObservable 没有绑定(bind)这个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68352631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com