{"id":442,"date":"2022-08-06T19:26:05","date_gmt":"2022-08-06T11:26:05","guid":{"rendered":"http:\/\/gjweb.top\/?p=442"},"modified":"2022-08-06T19:27:27","modified_gmt":"2022-08-06T11:27:27","slug":"react%e4%b8%ad%e4%bd%bf%e7%94%a8mobx%e7%9a%84%e9%85%8d%e7%bd%ae%e5%8f%8a%e8%b7%af%e7%94%b1%e6%87%92%e5%8a%a0%e8%bd%bd%e9%85%8d%e7%bd%ae","status":"publish","type":"post","link":"https:\/\/gjweb.top\/?p=442","title":{"rendered":"react\u4e2d\u4f7f\u7528mobx\u7684\u914d\u7f6e\u53ca\u8def\u7531\u61d2\u52a0\u8f7d\u914d\u7f6e"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"\u4e00-mobx\u914d\u7f6e\">\u4e00\u3001mobx\u914d\u7f6e<\/h2>\n\n\n\n<p>\u5b89\u88c5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yarn add mobx <br>yarn add mobx-react<br>yarn add babel-plugin-transform-decorators-legacy -D<br>yarn add @babel\/preset-env -D<br>yarn add babel-plugin-transform-class-properties -D<br>yarn add @babel\/plugin-proposal-decorators -D<\/code><\/pre>\n\n\n\n<p>react\u914d\u7f6e\u6587\u4ef6\u62bd\u79bb (\u5728\u5206\u79bb\u524d\u8981commit\u672c\u5730\u7684\u4ee3\u7801)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yarn eject<\/code><\/pre>\n\n\n\n<p>\u914d\u7f6e package.json \u6587\u4ef6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> &nbsp;\"babel\": {<br>     &nbsp; &nbsp;\"plugins\": &#91;<br>     &nbsp; &nbsp;  &#91;<br>     &nbsp; &nbsp; &nbsp; &nbsp;\"@babel\/plugin-proposal-decorators\",<br>     &nbsp; &nbsp; &nbsp;  {<br>     &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\"legacy\": true<br>     &nbsp; &nbsp; &nbsp;  }<br>     &nbsp; &nbsp;  ],<br> &nbsp; &nbsp; &nbsp;\"transform-class-properties\"<br> &nbsp;  ],<br> &nbsp; &nbsp;\"presets\": &#91;<br> &nbsp; &nbsp; &nbsp;\"react-app\",<br> &nbsp; &nbsp; &nbsp;\"@babel\/preset-env\"<br> &nbsp;  ]<br> },<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"\u4f7f\u7528\">\u4f7f\u7528<\/h3>\n\n\n\n<p>\u6a21\u5757\u5316\u72b6\u6001\u6587\u4ef6 auth.js<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import {makeObservable ,observable ,action} from \"mobx\"<br>class AuthStore {<br> &nbsp; &nbsp;\/\/ \u521d\u59cb\u5316\u72b6\u6001\u503c<br> &nbsp; &nbsp;@observable values = {<br> &nbsp; &nbsp; &nbsp; &nbsp;username:\"\",<br> &nbsp; &nbsp; &nbsp; &nbsp;password:\"\"<br> &nbsp;  }<br> &nbsp; &nbsp;\/\/ \u4fee\u6539\u72b6\u6001\u503c<br> &nbsp; &nbsp;@action setIsUsername(username){<br> &nbsp; &nbsp; &nbsp; &nbsp;this.values.username = username<br> &nbsp;  }<br> &nbsp; &nbsp;@action setIsPassword(password){<br> &nbsp; &nbsp; &nbsp; &nbsp;this.values.password = password<br> &nbsp;  }<br> &nbsp; &nbsp;\/\/ mobx5.0\u4ee5\u4e0a\u7248\u672c\u6dfb\u52a0\u6784\u9020\u51fd\u6570<br> &nbsp; &nbsp;constructor(){<br> &nbsp; &nbsp; &nbsp; &nbsp;makeObservable(this)<br> &nbsp;  }<br>}<br>export default AuthStore<\/code><\/pre>\n\n\n\n<p>\u521b\u5efa\u7edf\u4e00\u5bfc\u51fa\u5165\u53e3 index.js<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import React,{createContext,useContext} from \"react\"<br>import AuthStore from \".\/auth\"<br>\u200b<br>const context = createContext({<br> &nbsp;AuthStore: new AuthStore()<br>})<br>export const useStore = ()=&gt;useContext(context)<\/code><\/pre>\n\n\n\n<p>\u5728\u51fd\u6570\u7ec4\u4ef6\u4e2d\u4f7f\u7528<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import React, { useRef } from \"react\";<br>import { observer } from \"mobx-react\";<br>import { useStore } from \"..\/stores\/index\";<br>const Component = observer(() =&gt; {<br> &nbsp;const { AuthStore } = useStore();<br> &nbsp;const inputRef = useRef();<br> &nbsp;const handelChange = () =&gt; {<br> &nbsp; &nbsp;AuthStore.setIsUsername(inputRef.current.value)<br>  };<br> &nbsp;return (<br> &nbsp; &nbsp;&lt;&gt;<br> &nbsp; &nbsp; &nbsp;&lt;div&gt;Login:{AuthStore.values.username}&lt;\/div&gt;<br> &nbsp; &nbsp; &nbsp;&lt;input type=\"text\" onChange={handelChange} ref={inputRef} \/&gt;<br> &nbsp; &nbsp;&lt;\/&gt;<br>  );<br>});<br>export default Component;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u8def\u7531\u914d\u7f6e\">\u8def\u7531\u914d\u7f6e<\/h2>\n\n\n\n<p>index.js\u6587\u4ef6\u4e2d<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import React from 'react';<br>import ReactDOM from 'react-dom\/client';<br>import App from '.\/App';<br>import {<br> &nbsp;BrowserRouter<br>} from \"react-router-dom\"<br>const root = ReactDOM.createRoot(document.getElementById('root'));<br>root.render(<br> &nbsp;&lt;React.StrictMode&gt;<br> &nbsp; &nbsp;&lt;BrowserRouter&gt;<br> &nbsp; &nbsp; &nbsp;&lt;App \/&gt;<br> &nbsp; &nbsp;&lt;\/BrowserRouter&gt;<br> &nbsp;&lt;\/React.StrictMode&gt;<br>);<\/code><\/pre>\n\n\n\n<p>app.js\u6587\u4ef6&#8211; \u6ce8\u610f\u7248\u672c\u4e0d\u540c react18.0 \u4e2d\u7684 element\u5c5e\u6027\u63a5\u53d7\u7684\u662f &lt;\u7ec4\u4ef6\u540d\/&gt;; \u4ee5\u4e0b\u7248\u672c\u63a5\u53d7\u7684 &#8220;\u7ec4\u4ef6\u540d&#8221;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import '.\/App.css';<br>import React,{Suspense,lazy} from \"react\"<br>import {<br> &nbsp;Routes,<br> &nbsp;Route<br>} from \"react-router-dom\"<br>import Header from \".\/components\/header\"<br>import Footer from \".\/components\/footer\"<br>import Loading from \".\/components\/Loading\"<br>\u200b<br>\/\/ \u8def\u7531\u61d2\u52a0\u8f7d<br>const Home = lazy(()=&gt;import(\".\/pages\/home.js\"))<br>const History = lazy(()=&gt;import(\".\/pages\/history.js\"))<br>const About = lazy(()=&gt;import(\".\/pages\/about.js\"))<br>const Login = lazy(()=&gt;import(\".\/pages\/Login\"))<br>const Register = lazy(()=&gt;import(\".\/pages\/register\"))<br>\u200b<br>function App() {<br> &nbsp;return (<br> &nbsp; &nbsp;&lt;div className=\"App\"&gt;<br> &nbsp; &nbsp; &nbsp;&lt;Header\/&gt;<br> &nbsp; &nbsp; &nbsp;&lt;main&gt;<br> &nbsp; &nbsp; &nbsp;  {\/* \u61d2\u52a0\u8f7d\u524d\u7684Loading\u52a8\u753b *\/}<br> &nbsp; &nbsp; &nbsp; &nbsp;&lt;Suspense fallback={&lt;Loading\/&gt;}&gt; <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;Routes&gt;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;Route path=\"\/\" exact element={&lt;Home\/&gt;}&gt;&lt;\/Route&gt;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;Route path=\"\/history\" exact element={&lt;History\/&gt;}&gt;&lt;\/Route&gt;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;Route path=\"\/about\" exact element={&lt;About\/&gt;}&gt;&lt;\/Route&gt;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;Route path=\"\/login\" exact element={&lt;Login\/&gt;}&gt;&lt;\/Route&gt;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;Route path=\"\/register\" exact element={&lt;Register\/&gt;}&gt;&lt;\/Route&gt;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;\/Routes&gt;<br> &nbsp; &nbsp; &nbsp; &nbsp;&lt;\/Suspense&gt;<br> &nbsp; &nbsp; &nbsp;&lt;\/main&gt;<br> &nbsp; &nbsp; &nbsp;&lt;Footer\/&gt;<br> &nbsp; &nbsp;&lt;\/div&gt;<br>  );<br>}<br>\u200b<br>export default App;<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001mobx\u914d\u7f6e \u5b89\u88c5 react\u914d\u7f6e\u6587\u4ef6\u62bd\u79bb (\u5728\u5206\u79bb\u524d\u8981commit\u672c\u5730\u7684\u4ee3\u7801) \u914d\u7f6e package.j [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[52],"tags":[],"class_list":["post-442","post","type-post","status-publish","format-standard","hentry","category-react"],"_links":{"self":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts\/442","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=442"}],"version-history":[{"count":1,"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts\/442\/revisions"}],"predecessor-version":[{"id":443,"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts\/442\/revisions\/443"}],"wp:attachment":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=442"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=442"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=442"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}