MobX 在 hook 中的使用

关于 mobX 在 react 16.8.0 以上的用法
以下例子均取自官网文档

一般用法:

import { observer, useLocalStore } from 'mobx-react';  
const Hooks = observer(() => {  
 const todo = useLocalStore(() =>  ({  
 title: 'Click to toggle', done: false,  toggle() {  
  todo.done = !todo.done  
  },  
 get emoji() {  
 return todo.done ? '' : ''  
  },  
  }));  
  
 return <div onClick={todo.toggle}>  
    <h3>{todo.title} {todo.emoji}</h3>  
 </div>  
})  

可以看到原来的修饰符@observer,
现在是使用 HOC 来进行扩展的;

还有另外的 2 种修饰方法:

1:

import { useLocalStore, useObserver } from 'mobx-react';  
function Person() {  
 const person = useLocalStore(() => ({ name: 'John' }))  
 return useObserver(() => (  
 <div>  
    {person.name}  
    <button onClick={() => (person.name = 'Mike')}>No! I am Mike</button>  
 </div>  
 ))}  

使用 useObserver(()=>JSX.Element) 方法取代 observer(()=>JSX.Element)

2:

import { Observer, useLocalStore } from 'mobx-react';  
function ObservePerson() {  
 const person = useLocalStore(() => ({ name: 'John' }))  
 return (  
 <div>  
    {person.name} <i>I will never change my name</i>  
    <div>  
        <Observer>{() => <div>{person.name}</div>}</Observer>  
        <button onClick={() => (person.name = 'Mike')}>  
 I want to be Mike  </button>  
    </div>  
 </div>  
 )}  

使用部分渲染, 只有被 <Observer></Observer> 包裹的才能监听到对应值的改变

优化,分离,传值

import React, { FC } from 'react';import { observer, useLocalStore } from 'mobx-react';  
function initialFn(source) {  
 return ({  
 count: 2, get multiplied() {  
 return source.multiplier * this.count  
  },  
  inc() {  
 this.count += 1  },  
  });  
}  
  
const Counter: FC<{ multiplier: number }> = observer(props => {  
  
 const store = useLocalStore(  
  initialFn,  
 Object.assign({ a: 1 }, props),// 可以传任意值  
  );  
  
 return (  
 <div>  
    <button id="inc" onClick={store.inc}>  
    {`Count: ${store.count}`}  
    </button>  
    <span>{store.multiplied}</span>  
 </div>  
 )})  

这种分离的方法,基本已经耦合性已经很低了

作者:Grewer

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在React函数组件使用MobX,你需要将组件包裹在MobX Provider。 首先,你需要在你的应用程序安装MobXMobX React。 ```javascript npm install mobx mobx-react --save ``` 然后,你需要创建一个MobX Store来管理你的应用程序状态。在这个例子,我们创建了一个名为TodoStore的Store。 ```javascript import { observable, action } from 'mobx'; class TodoStore { @observable todos = []; @action addTodo = (todo) => { this.todos.push(todo); } } export default new TodoStore(); ``` 接下来,你需要将Provider和Store组合在一起。在这个例子,我们将TodoStore传递给Provider。 ```javascript import React from 'react'; import ReactDOM from 'react-dom'; import { Provider } from 'mobx-react'; import TodoStore from './TodoStore'; import App from './App'; ReactDOM.render( <Provider TodoStore={TodoStore}> <App /> </Provider>, document.getElementById('root') ); ``` 现在,你可以在你的组件使用MobX Store。在这个例子,我们在Todo组件使用了TodoStore。 ```javascript import React from 'react'; import { observer, inject } from 'mobx-react'; const Todo = inject('TodoStore')(observer(({ TodoStore, todo }) => ( <li>{todo} <button onClick={() => TodoStore.removeTodo(todo)}>Remove</button></li> ))); export default Todo; ``` 在这里,我们使用`inject`将TodoStore注入到Todo组件,并使用`observer`将Todo组件转换为可观察的组件,以便当TodoStore的数据发生变化时,Todo组件能够自动更新。 现在你已经知道如何在React函数组件使用MobX了。记得在组件使用MobX Store时,使用`inject`和`observer`将组件转换为可观察的组件,并将Store注入到组件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值