Reactjs 反应+;Mobx如何更改不同组件的值并在任何地方显示更改?
如何从不同的位置更改变量? 变量是一个,但它在不同的组件中分别更改,并且在一个组件中所做的这些更改不会反映在另一个组件中 App.jsReactjs 反应+;Mobx如何更改不同组件的值并在任何地方显示更改?,reactjs,mobx,mobx-react,Reactjs,Mobx,Mobx React,如何从不同的位置更改变量? 变量是一个,但它在不同的组件中分别更改,并且在一个组件中所做的这些更改不会反映在另一个组件中 App.js import AppStore from "./AppStore"; import { observer } from "mobx-react"; import SomeComponent from "./SomeComponent"; const store = AppStore(); const
import AppStore from "./AppStore";
import { observer } from "mobx-react";
import SomeComponent from "./SomeComponent";
const store = AppStore();
const App = observer(() => {
return (
<div className="App">
<div>
<i>This is text in App:</i> {store.text}
</div>
<div>
<button
onClick={() => {
store.changeText("This is text from App");
}}
>
Change text from App
</button>
</div>
<SomeComponent />
</div>
);
});
export default App;
import React from "react";
import AppStore from "./AppStore";
import { observer } from "mobx-react";
const store = AppStore();
const SomeComponent = observer((props) => {
return (
<div>
<div>
<i>This is text in component:</i> {store.text}
</div>
<div>
<button
onClick={() => store.changeText("This is text from component")}
>
Change text from component
</button>
</div>
</div>
);
});
export default SomeComponent;
import { action, makeObservable, observable } from "mobx";
export default function AppStore() {
return makeObservable(
{
text: "Initial text",
changeText(data) {
this.text = data + ": " + new Date().toLocaleTimeString();
}
},
{
text: observable,
changeText: action
}
);
}
在
App
组件中,您通过此代码const store=AppStore()创建了一个对象变量store
代码>。然后使用它,显示它,更改它等等。稍后,在SomeComponent
组件中,通过const store=AppStore()创建一个新变量store
代码>。即使变量名相同,并且使用对象,这也是两个不同的变量。因此,为什么更新一个不更新另一个。在DOM中,它们是不同的对象。要修复它,而不是在SomeComponent
中创建新对象,只需从父组件传递store
。在应用程序中
,当呈现某个组件时
像这样传递存储
变量
<SomeComponent store={store} />
这样,两个组件可以更改相同的变量数据
编辑。我对你的项目进行了分叉,并对代码进行了编辑,使之与我在这里发布的内容相匹配,这样你就有了一个可供分析的实例 我找到了与React上下文相关的解决方案。
很抱歉,没有立即在此处添加。
不幸的是,很难理解Mobx文档
首先,我们需要创建上下文并创建提供者:
然后,我们需要在index.js中使用以下内容包装主渲染:
import { StrictMode } from "react";
import ReactDOM from "react-dom";
import AppStoreProvider from "./AppStoreProvider";
import App from "./App";
const rootElement = document.getElementById("root");
ReactDOM.render(
<AppStoreProvider>
<App />
</AppStoreProvider>,
rootElement
);
从“react”导入{StrictMode};
从“react dom”导入react dom;
从“/AppStoreProvider”导入AppStoreProvider;
从“/App”导入应用程序;
const rootElement=document.getElementById(“根”);
ReactDOM.render(
然后我们可以使用上下文:
import "./styles.css";
import React from "react";
import { UseAppStore } from "./AppStoreProvider";
import { observer } from "mobx-react";
import SomeComponent from "./SomeComponent";
const App = observer(() => {
const store = UseAppStore();
return (
<div className="App">
<div>
<i>This is text in App:</i> {store?.text}
</div>
<div>
<button
onClick={() => {
store.changeText("This is text from App");
}}
>
Change text from App
</button>
</div>
<SomeComponent />
</div>
);
});
export default App;
导入“/styles.css”;
从“React”导入React;
从“/AppStoreProvider”导入{UseAppStore}”;
从“mobx react”导入{observer};
从“/SomeComponent”导入SomeComponent;
常量应用程序=观察者(()=>{
const store=UseAppStore();
返回(
这是应用程序中的文本:{store?.text}
{
store.changeText(“这是来自应用程序的文本”);
}}
>
更改应用程序中的文本
);
});
导出默认应用程序;
或者像这样:
import { useContext } from "react";
import { AppStoreContext } from "./AppStoreProvider";
import { observer } from "mobx-react";
const SomeComponent = observer((props) => {
const store = useContext(AppStoreContext);
return (
<div>
<div>
<i>This is text in component:</i> {store.text}
</div>
<div>
<button onClick={() => store.changeText("This is text from component")}>
Change text from component
</button>
</div>
</div>
);
});
export default SomeComponent;
从“react”导入{useContext};
从“/AppStoreProvider”导入{AppStoreContext};
从“mobx react”导入{observer};
const SomeComponent=观察者((道具)=>{
const store=useContext(AppStoreContext);
返回(
这是组件{store.text}中的文本
store.changeText(“这是来自组件的文本”)}>
从组件更改文本
);
});
导出默认组件;
希望它对某人有用谢谢。谢谢。它很有效。但是没有道具真的没有办法在不同的组件中使用单个商店吗?@ArtSur欢迎你。有wayst,有点。你可以使用redux。你仍然需要使用道具,但不是从父母传给孩子,这会让人恼火,而且时间越长你们拥有的ld组件,你们有一个全球化的存储,你们可以使用容器从整个项目中选择你们想要的任何数据,并使用动作从任何地方修改你们想要的任何数据。现在我听到了react发布的一个叫做memo的东西,若我没记错的话,它支持和redux一样做,但更简单。但我从来并没有尝试过。使用mobx react
我不知道。我从来没有使用过它,也没听说过它,不管怎样,你必须只有一个存储实例。不能执行多个createStore
方法来创建整个新存储。
import { StrictMode } from "react";
import ReactDOM from "react-dom";
import AppStoreProvider from "./AppStoreProvider";
import App from "./App";
const rootElement = document.getElementById("root");
ReactDOM.render(
<AppStoreProvider>
<App />
</AppStoreProvider>,
rootElement
);
import "./styles.css";
import React from "react";
import { UseAppStore } from "./AppStoreProvider";
import { observer } from "mobx-react";
import SomeComponent from "./SomeComponent";
const App = observer(() => {
const store = UseAppStore();
return (
<div className="App">
<div>
<i>This is text in App:</i> {store?.text}
</div>
<div>
<button
onClick={() => {
store.changeText("This is text from App");
}}
>
Change text from App
</button>
</div>
<SomeComponent />
</div>
);
});
export default App;
import { useContext } from "react";
import { AppStoreContext } from "./AppStoreProvider";
import { observer } from "mobx-react";
const SomeComponent = observer((props) => {
const store = useContext(AppStoreContext);
return (
<div>
<div>
<i>This is text in component:</i> {store.text}
</div>
<div>
<button onClick={() => store.changeText("This is text from component")}>
Change text from component
</button>
</div>
</div>
);
});
export default SomeComponent;