Reactjs 反应MobX观测值保持重置
我面临的问题是,我的MobX存储观测值在路线导航/组件加载时不断重置。场景如下,用户选择一个帐户并将其存储在Reactjs 反应MobX观测值保持重置,reactjs,react-router,mobx,Reactjs,React Router,Mobx,我面临的问题是,我的MobX存储观测值在路线导航/组件加载时不断重置。场景如下,用户选择一个帐户并将其存储在selectedAccountobservable中 selectedAccount将被解析为一个保护组件,该组件检查是否已选择帐户。如果没有,用户必须选择一个帐户,并将重定向到使用保护组件的欢迎页面。但在导航时,selectedAccount将重置为空对象,因此保护组件将重定向回“选择帐户”页面 我想知道这是否与存储所选帐户的存储的初始化有关: export interface IUse
selectedAccount
observable中
selectedAccount
将被解析为一个保护组件,该组件检查是否已选择帐户。如果没有,用户必须选择一个帐户,并将重定向到使用保护组件的欢迎页面。但在导航时,selectedAccount将重置为空对象,因此保护组件将重定向回“选择帐户”页面
我想知道这是否与存储所选帐户的存储的初始化有关:
export interface IUserStore {
users: any;
singleUser: any;
selectedAccount: any;
getUsers(): Promise<void>;
createUser(obj: any): any;
selectAccount(obj: any): any;
getSingleUser(id: string): Promise<void>;
updateUser(obj: any): any;
保护组件:
interface AppProps extends RouteProps {
userStore: IUserStore
}
发件人:
MobX可观察对象不会检测到以前未声明为可观察的属性分配,也不会对这些属性分配做出反应。因此,MobX可观测对象充当具有预定义键的记录
您可以尝试以下方法之一:
- 升级到Mobx
v5
- 使用而不是
可观察的
- 更新/添加
byselectedAccount
- 升级到Mobx
v5
- 使用而不是
可观察的
- 更新/添加
byselectedAccount
链接来重定向,我使用的是锚定标签
因此,用react router
Link
替换锚定标签解决了这个问题
对于其他遇到同样问题的人,mobx persist
是一个库,可以在页面刷新时保留obeservables值。结果表明,我没有使用Link
重定向,而是使用了锚定标记
因此,用react router
Link
替换锚定标签解决了这个问题
对于遇到相同问题的任何其他人,mobx persist
是一个可以在页面刷新时保持obeservables值的库。您能否在问题中包括呈现提供者的组件和初始化用户存储的代码?是,我已经更新了op。userStore被注入了多个位置。您能否在问题中包括呈现提供者的组件和初始化userStore
的代码?是的,我已经更新了op。userStore被注入了多个位置。
interface AppProps extends RouteProps {
userStore: IUserStore
@inject('userStore')
@observer
export class AccountRequired extends Route<any> {
public render() {
if (Object.keys(this.props.userStore.selectedAccount).length == 0) {
const renderComponent = () => (<Redirect to={{pathname: "/selectAccount"}}/>);
return <Route {...this.props} component={renderComponent} render={undefined}/>;
} else {
return <Route {...this.props}/>;
}
}
}
// Stores
import { stores } from './Stores';
ReactDOM.render(<Provider {...stores }><App /></Provider>, document.getElementById('root'));
import { AccountStore } from "./AccountStore";
import { UserStore } from "./UserStore";
import { RolesStore } from "./RoleStore";
interface Stores {
[key: string]: any;
}
export const stores:Stores = {
accountStore: new AccountStore(),
userStore: new UserStore(),
rolesStore: new RolesStore()
}