reactjs - 在 mobx 中更新状态时组件不会重新渲染
问题描述
我试图理解为什么当我在 mobx 可观察名称数组中更改我的状态时我的应用程序没有重新呈现。我正在使用输入标签更改值。希望得到一些帮助:)
观察者组件:
import {observable, action, autorun, computed} from 'mobx'
class TodosStore {
@observable names = ["p1", "p2", "p3"]
@observable filter = ""
@action
get filterredValue(){
return store.names.filter(word => word.includes(this.filter))
}
}
//@ts-ignore
var store = window.store = new TodosStore
export default store
autorun(() => {
console.log(store.filter);
console.log(store.names);
})
这是我的应用程序组件:
import React from 'react';
import './App.css';
import store from './components/observers'
class App extends React.Component {
constructor(props :any) {
super(props);
this.setName = this.setName.bind(this);
}
setName = (e : any) => {
store.filter = e.target.value
}
render() {
return (
<div className="App">
<header className="App-header">
{store.filterredValue.map((name) => <li key={name}>{name}</li>)}
<input
onChange={(e) => this.setName(e)}
/>
</header>
</div>
);
}
}
export default App;
解决方案
首先,您需要将每个使用observable
状态的组件包装到observer
装饰器中,如下所示:
import {observer} from 'mobx-react'
@observer
class App extends React.Component {
// ...
}
// or if you are using functional components:
const App = observer(() => {
// ...
})
此外,如果您使用的是 MobX 版本 6,则需要makeObservable
在类构造函数中添加调用:
import {observable, action, autorun, computed, makeObservable} from 'mobx'
class TodosStore {
@observable names = ["p1", "p2", "p3"]
@observable filter = ""
constructor() {
makeObservable(this);
}
@action
get filterredValue(){
return store.names.filter(word => word.includes(this.filter))
}
}
推荐阅读
- android - 我发布的应用未在 Google Play 商店中显示
- postgresql - 如何在多阶段 Docker 容器中构建 Postgres jsonlog
- c# - 有多少用户可以同时访问存储在共享目录中的 C# WPF 应用程序?
- python - Python Selenium 获取快照的交易视图 URL
- c++ - 我可以将值用户输入存储在队列中,然后将队列本身存储在文件中吗?
- node.js - 如何在不删除文件的情况下更新 Elastic Beanstalk Node.js 项目
- firefox - FF 和 Chrome/Edge XSLT 引擎在插入“”文本方面的区别
- javascript - 使用 react-router-dom 私有路由延迟加载
- excel - 带旋转的Excel复制功能
- python - 获取此矩阵的对角线