我是JS / React / MobX /其他新手,试图做一些非常简单的事情而没有成功。
我想要的是 - 2个按钮,一旦点击,在模态中显示相应的标签,使用react-bootstrap和mobx。
但我一直收到这个错误:
[mobx]遇到一个由反应或观察者组件抛出的未捕获异常,在:'反应[AuthModal#0.render()]错误:[mobx]不变失败:副作用如:此时不允许改变状态。您是否尝试从例如React组件的渲染功能修改状态?试图修改:AuthModalStore@3.tab
请帮忙。非常感谢。
商店代码:
import { observable } from 'mobx';
class AuthModalStore {
@observable show = false;
@observable tab = 1;
constructor() {
this.turnOn = this.turnOn.bind(this);
this.turnOff = this.turnOff.bind(this);
this.changeToTab = this.changeToTab.bind(this);
}
turnOn(key = 1) {
console.log('running turnOn');
this.tab = key;
this.show = true;
}
turnOff() {
this.show = false;
}
changeToTab(key) {
this.tab = key;
}
}
const store = new AuthModalStore();
export default store;
反应成分:
import React from 'react';
import { inject, observer } from 'mobx-react';
import AuthModal from './AuthModal';
@inject('authModalStore')
@observer
export default class AuthButtons extends React.Component {
handleClick(event) {
var key;
switch (event.target.innerHTML) {
case 'Log In':
key = 1;
break;
case 'Sign Up':
key = 2;
break;
default:
key = 1;
}
this.props.authModalStore.turnOn(key);
}
render() {
return (
<div className="nav navbar-nav navbar-right">
{/* login / signup buttons in navbar */}
<ul className="nav navbar-nav btn-toolbar">
<li className="btn-group">
<p className="navbar-btn text-uppercase">
<a onClick={this.handleClick.bind(this)} className="btn btn-default">Log In</a>
</p>
</li>
<li className="btn-group">
<p className="navbar-btn text-uppercase">
<a onClick={this.handleClick.bind(this)} className="btn btn-primary">Sign Up</a>
</p>
</li>
</ul>
<AuthModal />
</div>
);
}
}
答案 0 :(得分:1)
我看到您正在更改mobx状态,而包装的代码不在动作函数中。
如果函数更改了状态,则应将其修饰为action
https://mobx.js.org/refguide/action.html
仅应且始终将操作用于修改状态的功能。仅执行查找,过滤器等的功能不应标记为动作;允许MobX跟踪其调用。
此外,如果功能应绑定到类,则可以使用装饰器:
@action.bound
希望我能帮上忙。
答案 1 :(得分:0)
答案在这里提供: https://github.com/mobxjs/mobx/issues/829
使用它:
<a onClick={() => this.props.authModalStore.changeToTab(2)}>Not a member yet?</a>
<a onClick={() => this.props.authModalStore.changeToTab(3)} className="pull-right">Forgot password?</a>
而不是
<a onClick={this.props.authModalStore.changeToTab(2)}>Not a member yet?</a>
<a onClick={this.props.authModalStore.changeToTab(3)} className="pull-right">Forgot password?</a>