mobX + React 无法注入
mobX + React can't inject
我有这个问题,我看了答案,但不能解决我的问题。
错误提示我 'TypeError: Cannot read property 'changeUsername' of undefined'
。
代码如下:
import {observer, inject} from 'mobx-react';
@inject(['loginStore'])
@observer
class login extends Component {
changeUsername = (e) => {
debugger;
this.props.loginStore.changeUsername(e.target.value)
}
changePassword = (e) => {
debugger;
this.props.loginStore.changePassword(e.target.value)
}
}
您需要确保已使用您的应用程序注册商店实例。这是通过 Provider
组件完成的(参见下面的示例)。
<Provider>
确保您的应用程序中的嵌套组件可以访问登录存储 - 在您的例子中是登录组件。需要注意的一些关键概念是:
- 必须定义商店对象
- 必须通过
<Provider/>
注册商店实例(参见下面的示例)
- 存储然后可以被组件访问
@inject
可用于 select 并将特定商店注入组件(即在复杂应用程序定义了许多商店的情况下)
此代码示例有望为您传达这些概念:
import {observer, Provider, inject, action } from 'mobx-react';
/*
Define your loginStore
*/
class LoginStore {
@action
changeUsername(value) {
console.log(value)
}
@action
changePassword(value) {
console.log(value)
}
}
@inject('loginStore')
@observer
class login extends Component {
/* Declare member function in this way, rather than as lambda function */
changeUsername(e) {
debugger;
this.props.loginStore.changeUsername(e.target.value)
}
/* Declare member function in this way, rather than as lambda function */
changePassword(e) {
debugger;
this.props.loginStore.changePassword(e.target.value)
}
render() {
return <p>hello world</p>
}
}
/*
You need to register your store with the provider
*/
const app = (
<Provider loginStore={ new LoginStore() }>
<login />
</Provider>
);
ReactDom.render(app, container);
@Dacre丹尼
你好,我不知道怎么回复,所以我@你。
我是按照你说的方式使用的,id router code use '' follow:
import * as stores from '../stores';
export default class Container extends BasePage{
render(){
return(
<Provider { ...stores}>
<Router>
<Switch>
<Route path="/login" component={login}/>
<Route path="/reg" component={reg}/>
<Route path="/404" component={NotFound}/>
<Route path="/main" component={mainindex}/>
<Route path="/react" component={App}/>
<Route component={adminmain}/>
</Switch>
</Router>
</Provider>
)
}
}
您在数组中注入了商店名称。它应该只是一个参数
@inject('loginStore')
其中 `loginStore' 是您的商店文件中的任何导出内容。
我有这个问题,我看了答案,但不能解决我的问题。
错误提示我 'TypeError: Cannot read property 'changeUsername' of undefined'
。
代码如下:
import {observer, inject} from 'mobx-react';
@inject(['loginStore'])
@observer
class login extends Component {
changeUsername = (e) => {
debugger;
this.props.loginStore.changeUsername(e.target.value)
}
changePassword = (e) => {
debugger;
this.props.loginStore.changePassword(e.target.value)
}
}
您需要确保已使用您的应用程序注册商店实例。这是通过 Provider
组件完成的(参见下面的示例)。
<Provider>
确保您的应用程序中的嵌套组件可以访问登录存储 - 在您的例子中是登录组件。需要注意的一些关键概念是:
- 必须定义商店对象
- 必须通过
<Provider/>
注册商店实例(参见下面的示例) - 存储然后可以被组件访问
@inject
可用于 select 并将特定商店注入组件(即在复杂应用程序定义了许多商店的情况下)
此代码示例有望为您传达这些概念:
import {observer, Provider, inject, action } from 'mobx-react';
/*
Define your loginStore
*/
class LoginStore {
@action
changeUsername(value) {
console.log(value)
}
@action
changePassword(value) {
console.log(value)
}
}
@inject('loginStore')
@observer
class login extends Component {
/* Declare member function in this way, rather than as lambda function */
changeUsername(e) {
debugger;
this.props.loginStore.changeUsername(e.target.value)
}
/* Declare member function in this way, rather than as lambda function */
changePassword(e) {
debugger;
this.props.loginStore.changePassword(e.target.value)
}
render() {
return <p>hello world</p>
}
}
/*
You need to register your store with the provider
*/
const app = (
<Provider loginStore={ new LoginStore() }>
<login />
</Provider>
);
ReactDom.render(app, container);
@Dacre丹尼 你好,我不知道怎么回复,所以我@你。
我是按照你说的方式使用的,id router code use '' follow:
import * as stores from '../stores';
export default class Container extends BasePage{
render(){
return(
<Provider { ...stores}>
<Router>
<Switch>
<Route path="/login" component={login}/>
<Route path="/reg" component={reg}/>
<Route path="/404" component={NotFound}/>
<Route path="/main" component={mainindex}/>
<Route path="/react" component={App}/>
<Route component={adminmain}/>
</Switch>
</Router>
</Provider>
)
}
}
您在数组中注入了商店名称。它应该只是一个参数
@inject('loginStore')
其中 `loginStore' 是您的商店文件中的任何导出内容。