[英]Unidirectional Data Flow in React with MobX
我正在嘗試使用MobX和React設置項目體系結構,並且想知道是否將以下內容視為“不錯”。 我不希望這個問題最終成為另一個問題,“這是個人喜好,因此,這個問題不屬於這里……我們都可以同意,有些事情確實很糟糕。
所以我在考慮只擁有一個看起來像這樣的Store.js
文件:
import { observable, action, useStrict } from 'mobx';
useStrict(true);
export const state = observable({
title: ''
});
export const actions = {
setTitle: action((title) => {
state.title = title;
})
};
注意 :所有應用程序狀態都將處於state
,只有一個存儲。
然后,在根組件aka App.js
使用state
, App.js
所示:
import React, { Component } from 'react';
import { observer } from 'mobx-react';
import { state } from './Store';
import DisplayTitle from './components/DisplayTitle/DisplayTitle';
import SetTitle from './components/SetTitle/SetTitle';
class App extends Component {
render() {
return (
<div className="App">
<DisplayTitle title={state.title}/>
<SetTitle />
</div>
);
}
}
export default observer(App);
很明顯,我的應用程序中會包含很多組件,但是沒有一個組件會直接從Store.js
讀取state
。 只有我的App.js
會導入狀態並將其傳遞到組件樹下。
另一個注意事項 :我不太確定為什么其他組件不能直接從Store.js
讀取狀態...
DisplayTitle
組件就是這種情況:
import React, { Component } from 'react';
class DisplayTitle extends Component {
render () {
return (
<h1>{this.props.title}</h1>
);
}
}
export default DisplayTitle;
但是,即使沒有其他組件可以直接導入state
( App.js
除外),任何組件都可以從Store.js
導入actions
以使state
發生突變。
例如在SetTitle
組件中:
import React, { Component } from 'react';
import { actions } from './../../Store';
class SetTitle extends Component {
updateTitle (e) {
actions.setTitle(e.currentTarget.value);
}
render () {
return (
<input onChange={this.updateTitle} type='text'/>
);
}
}
export default SetTitle;
是否有任何缺陷或其他明顯的原因導致這種方法不是最佳選擇? 我希望收到所有反饋!
你缺少一些東西
在根級別:
import { Provider } from 'mobx-react'
...
<Provider state={state}>
<Other stuff />
</Provider>
在組件級別:
import { inject } from 'mobx-react'
@inject('state')
class Foo ... {
handleClick(){
this.props.state.setTitle('foo')
}
render(){
return <div onClick={() => this.handleClick()}>{this.props.state.title}</div>
}
}
您只能在提供程序中粘貼接口actions={actions}
並將其注入,以確保子代可以調用您的API方法來改變狀態並使狀態自下而上流動。 盡管如果直接對其進行突變,則不會發生任何副作用,因為所有組件都將在渲染樹中進行willReact
和更新-通量更willReact
推理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.