one more time one more chance. 一歩重頭學前端, MobX入門。
MobX用於簡單、可擴展的狀態管理。一般搭配 React 使用,但不僅限於 React。如何你厭煩了 Redux 繁雜的模板代碼和 API,那麼能夠嘗試下 MobX。網上好像流傳: Redux 是誰用誰加班😂。前端
網上某位大牛的 ppt, 連接有機會再補上。此處的本身
爲庫的開發者,別人
是指庫的使用者,也就是我等碼農。react
用一句話歸納 MobX: 追蹤你的改變,併爲之作出響應。
Step 1: npx create-react-app mobx-todo-list
建立項目git
Step 2: npm install -S mobx mobx-react
安裝 mobx 的相關依賴github
Step 3: 使create-react-app 建立的項目支持裝飾器語法npm
npm run eject npm install --save-dev babel-plugin-transform-decorators-legacy
Step 4: 修改配置文件package.json編程
"babel": { "plugins": [ "transform-decorators-legacy" ], "presets": [ "react-app" ] }
Mobx 中建立 store 的常見關鍵字以下: observable
computed
action
。observable
用來聲明可觀察的數據、computed
是聲明可觀察數據的演變數據,和 observable 具備同等地位,action
用來改變observable
數據,可是 action
不是必須的,能夠認爲其是較好的約定,最好遵循。在 mobx 程序中使用class
、裝飾器
是最佳實踐,所以咱們的代碼也使用裝飾器實現。json
import {observable, computed, action} from 'mobx'; class Todo { // 定義一個 TODO 項目的類,id 是隨機數,沒有使用@observable 裝飾能夠理解爲是隻讀的 id = Math.random(); // todo 的 title 及完成狀態 finished 是可被觀察及更新的,同時 finished 的初始狀態爲 false @observable title; @observable finished = false; // 構造函數接收tile constructor(title) { this.title = title; } } // TODO List 類 class TodoList { // 可被觀察的待辦項 todos @observable todos = []; // 計算屬性,重可觀察屬性 todos 衍生出來,返回沒有完成的待辦項的個數 @computed get unfinishedTodoCount() { return this.todos.filter(todo => !todo.finished).length; } // 動做用來更新 todos 屬性的值,添加待辦項 @action addTodo = title => { if (!title) return; this.todos.push(new Todo(title)); } } // 咱們建立TodoList 對象,在手動的添加兩個待辦項,此處的 store 對象能夠理解爲是一個單例,在將其引用暴露出去 const store = new TodoList(); store.todos.push(new Todo('Get Coffee'), new Todo('Write blog')); store.todos[0].finished = true; export default store;
Provider
、observer
、inject
均爲是mobx-react提供。Provider
以組件的形式存在,用來包裹最外層組件節點,而且傳入 store(經過)context 傳遞給後代組件。
使用@observer
裝飾的react組件將轉換成一個監聽者,當@observable 修飾的數據變化,react組件就會從新渲染。@inject
爲了使被裝飾的組件以 props 的形式獲取到 Provider 傳遞過來的數據。小程序
import {observer, inject} from 'mobx-react'; const TodoView = ({todo}) => ( <li> <input type="checkbox" checked={todo.finished} // 此處的 onChange 並未遵循 action 的約定,進一步證實了直接更新 store 的數據也是可行的 onChange={() => {todo.finished = !todo.finished;}} /> {todo.title} </li> ) @inject('todolist') @observer export default class TodoListView extends Component { state = { title: '' } changeTitle = e => { let title = e.target.value; this.setState({title}); } // 調用 store 中的 addTodoaction 更新 store 裏面的數據 submit = () => { this.props.todolist.addTodo(this.state.title); } render() { return ( <div> <input type="text" value={this.state.title} onChange={this.changeTitle} /> <button onClick={this.submit}>submit</button> <ul> {this.props.todolist.todos.map(todo => ( <TodoView todo={todo} key={todo.id} /> ))} </ul> Tasks left: {this.props.todolist.unfinishedTodoCount} </div> ); } }
import TodoListView from './TodoListView'; import store from './store'; import {Provider} from 'mobx-react'; export default class App extends Component { // 將 store 傳給 Provider render() { return ( <Provider todolist={store}> <TodoListView /> </Provider> ); } };
項目完整代碼mobx-todo-list瀏覽器
Todo list 實現完成,理論講解,逐步更新。歡迎你們批評指正。babel
前端學習QQ羣: 538631558
【開發環境推薦】 Cloud Studio 是基於瀏覽器的集成式開發環境,支持絕大部分編程語言,包括 HTML五、PHP、Python、Java、Ruby、C/C++、.NET 小程序等等,無需下載安裝程序,一鍵切換開發環境。 Cloud Studio提供了完整的 Linux 環境,而且支持自定義域名指向,動態計算資源調整,能夠完成各類應用的開發編譯與部署。