react16.8.0以上MobX在hook中的使用方法詳解
引言
關(guān)于 mobX 在 react 16.8.0 以上的用法
以下例子均取自官網(wǎng)文檔
一般用法
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>
})可以看到原來(lái)的修飾符@observer,現(xiàn)在是使用 HOC 來(lái)進(jìn)行擴(kuò)展的;
修飾方法
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> 包裹的才能監(jiān)聽(tīng)到對(duì)應(yīng)值的改變
優(yōu)化,分離,傳值
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>
)})這種分離的方法,基本已經(jīng)耦合性已經(jīng)很低了
2021.3.11 更新
之前 mobx 官方對(duì)于 api 又進(jìn)行了修改,本文也做對(duì)應(yīng)的修改
重要修改: useLocalStore 將要廢棄 !!
使用 useLocalObservable 替代, 而且他們的使用方案也不同:
import { useLocalObservable, Observer } from "mobx-react-lite"
const Todo = () => {
const todo = useLocalObservable(() => ({
title: "Test",
done: true,
toggle() {
this.done = !this.done
}
}))
return (
<Observer>
{() => (
<h1 onClick={todo.toggle}>
{todo.title} {todo.done ? "[DONE]" : "[TODO]"}
</h1>
)}
</Observer>
)
}可直接作為局部或者全局的變量存儲(chǔ)
const user = mobx.observable({
name: "Noa"
})
const Todo = () => {
return (
<Observer>
{() => (
<h1>
{user.name}
</h1>
)}
</Observer>
)
}以上就是react16.8.0以上MobX在hook中的使用方法詳解的詳細(xì)內(nèi)容,更多關(guān)于react MobX hook使用方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
React19 Diff 算法的具體實(shí)現(xiàn)
本文主要介紹了React19 Diff 算法的具體實(shí)現(xiàn),該算法用于高效地更新虛擬DOM,它通過(guò)優(yōu)化傳統(tǒng)樹(shù)diff算法,將復(fù)雜度從O(n^3)降低到O(n),感興趣的可以了解一下2026-05-05
React 中實(shí)現(xiàn)代碼分割的方法與實(shí)踐指南
這篇文章給大家介紹了React中實(shí)現(xiàn)代碼分割的方法,包括路由級(jí)代碼分割和組件級(jí)代碼分割,并闡述了其原理和實(shí)際應(yīng)用場(chǎng)景,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2026-01-01
探討JWT身份校驗(yàn)與React-router無(wú)縫集成
這篇文章主要為大家介紹了JWT身份校驗(yàn)與React-router無(wú)縫集成的探討解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
React渲染機(jī)制及相關(guān)優(yōu)化方案
這篇文章主要介紹了react中的渲染機(jī)制以及相關(guān)的優(yōu)化方案,內(nèi)容包括react渲染步驟、concurrent機(jī)制以及產(chǎn)生作用的機(jī)會(huì),簡(jiǎn)單模擬實(shí)現(xiàn) concurrent mode,基于作業(yè)調(diào)度優(yōu)先級(jí)的思路進(jìn)行項(xiàng)目?jī)?yōu)化的兩個(gè)hooks,感興趣的小伙伴跟著小編一起來(lái)看看吧2023-07-07
React實(shí)現(xiàn)路由鑒權(quán)的實(shí)例詳解
React應(yīng)用中的路由鑒權(quán)是確保用戶(hù)僅能訪問(wèn)其授權(quán)頁(yè)面的方式,用于已登錄或具有訪問(wèn)特定頁(yè)面所需的權(quán)限,這篇文章就來(lái)記錄下React實(shí)現(xiàn)路由鑒權(quán)的流程,需要的朋友可以參考下2024-07-07
詳解如何使用React和MUI創(chuàng)建多選Checkbox樹(shù)組件
這篇文章主要為大家詳細(xì)介紹了如何使用 React 和 MUI(Material-UI)庫(kù)來(lái)創(chuàng)建一個(gè)多選 Checkbox 樹(shù)組件,該組件可以用于展示樹(shù)形結(jié)構(gòu)的數(shù)據(jù),并允許用戶(hù)選擇多個(gè)節(jié)點(diǎn),感興趣的可以了解下2024-01-01

