<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        使用store來優化React組件的方法

        來源:懂視網 責編:小采 時間:2020-11-27 22:27:17
        文檔

        使用store來優化React組件的方法

        使用store來優化React組件的方法:在使用 React 編寫組件的時候,我們常常會碰到兩個不同的組件之間需要共享狀態情況,而通常的做法就是提升狀態到父組件。但是這樣做會有一個問題,就是盡管只有兩個組件需要這個狀態,但是因為把狀態提到了父組件,那么在狀態變化的時候,父組件以及
        推薦度:
        導讀使用store來優化React組件的方法:在使用 React 編寫組件的時候,我們常常會碰到兩個不同的組件之間需要共享狀態情況,而通常的做法就是提升狀態到父組件。但是這樣做會有一個問題,就是盡管只有兩個組件需要這個狀態,但是因為把狀態提到了父組件,那么在狀態變化的時候,父組件以及

        在使用 React 編寫組件的時候,我們常常會碰到兩個不同的組件之間需要共享狀態情況,而通常的做法就是提升狀態到父組件。但是這樣做會有一個問題,就是盡管只有兩個組件需要這個狀態,但是因為把狀態提到了父組件,那么在狀態變化的時候,父組件以及其下面的所有子組件都會重新 render,如果你的父組件比較復雜,包含了其他很多子組件的話,就有可能引起性能問題。

        Redux 通過把狀態放在全局的 store 里,然后組件去訂閱各自需要的狀態,當狀態發生變化的時候,只有那些訂閱的狀態發生變化的組件才重新 render,這樣就避免了上面說的提升狀態所帶來的副作用。但是,當我們在寫一個 React 組件庫的時候,redux 加 react-redux 的組合可能就有點太重了。所以我們可以自己寫一個簡單的 store,來實現類似 Redux 的訂閱模式。

        參考 Redux 的實現來寫一個簡版的 createStore:

        function createStore(initialState) {
         let state = initialState;
         const listeners = [];
        
         function setState(partial) {
         state = {
         ...state,
         ...partial,
         };
         for (let i = 0; i < listeners.length; i++) {
         listeners[i]();
         }
         }
        
         function getState() {
         return state;
         }
        
         function subscribe(listener) {
         listeners.push(listener);
        
         return function unsubscribe() {
         const index = listeners.indexOf(listener);
         listeners.splice(index, 1);
         };
         }
        
         return {
         setState,
         getState,
         subscribe,
         };
        }
        
        

        我們的 createStore 非常簡單,算上空行也只有 33 行,總共暴露了 3 個方法,沒有 Redux 里的 dispatch 和 reducer,直接通過 setState 方法改變狀態。下面我們來用它一個計數器的例子。

        class Counter extends React.Component {
         constructor(props) {
         super(props);
        
         // 初始化 store
         this.store = createStore({
         count: 0,
         });
         }
        
         render() {
         return (
         <div>
         <Buttons store={store} />
         <Result store={store} />
         </div>
         )
         }
        }
        
        class Buttons extends React.Component {
         handleClick = (step) => () => {
         const { store } = this.props;
         const { count } = store.getState();
         store.setState({ count: count + step });
         }
        
         render() {
         return (
         <div>
         <button onClick={this.handleClick(1)}>+</button>
         <button onClick={this.handleClick(1)}>-</button>
         </div>
         );
         }
        }
        
        class Result extends React.Component {
         constructor(props) {
         super(props);
        
         this.state = {
         count: props.store.getState().count,
         };
         }
        
         componentDidMount() {
         this.props.store.subscribe(() => {
         const { count } = this.props.store.getState();
         if (count !== this.state.count) {
         this.setState({ count });
         }
         });
         }
        
         render() {
         return (
         <div>{this.state.count}</div>
         );
         };
        }
        

        例子中 Buttons 里通過 store.setState 來改變 store 中的狀態,并不會引起整個 Counter 的重新 render,但是因為 Result 中訂閱了 store 的變化,所以當 count 有變化的時候就可以通過改變自己組件內的狀態來重新 render,這樣就巧妙地避免了不必須要的 render。

        最后,上面的 createStore 雖然只有幾十行代碼,我還是把它寫成了一個叫 mini-store 庫放在 GitHub 上,并且提供了類似 Redux 的 Provider 和 connect 方法,總共加起來也就 100 多行代碼。如果你也在寫 React 組件庫,需要管理一個復雜組件的狀態,不妨試試這個優化方式。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        使用store來優化React組件的方法

        使用store來優化React組件的方法:在使用 React 編寫組件的時候,我們常常會碰到兩個不同的組件之間需要共享狀態情況,而通常的做法就是提升狀態到父組件。但是這樣做會有一個問題,就是盡管只有兩個組件需要這個狀態,但是因為把狀態提到了父組件,那么在狀態變化的時候,父組件以及
        推薦度:
        標簽: 方法 使用 Store
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产精品99久久久久久| 337p欧洲亚洲大胆艺术| 亚洲精品无码成人| 成人激情免费视频| 亚洲欧美日韩综合俺去了| 97无码免费人妻超级碰碰夜夜| 久久久久国产成人精品亚洲午夜 | j8又粗又长又硬又爽免费视频| 免费无码又爽又刺激高潮| 亚洲一区二区三区丝袜| 四虎影视永久免费观看| eeuss影院ss奇兵免费com| 亚洲精品国产字幕久久不卡 | 成全动漫视频在线观看免费高清版下载 | 哒哒哒免费视频观看在线www | 大地影院MV在线观看视频免费| 亚洲人成电影在线播放| 免费毛片在线看不用播放器| 日木av无码专区亚洲av毛片| 国产成人精品免费午夜app | 啦啦啦高清视频在线观看免费 | 黑人精品videos亚洲人| 人妻丰满熟妇无码区免费 | 皇色在线视频免费网站| 亚洲AV电影天堂男人的天堂| 国产aⅴ无码专区亚洲av麻豆| fc2免费人成在线视频| 久久99亚洲网美利坚合众国 | 污污网站免费观看| 亚洲欧美成人综合久久久| 亚洲成av人在片观看| 222www免费视频| 国产成人精品日本亚洲语音| 国产日韩成人亚洲丁香婷婷| 在线观看永久免费| 日本高清免费中文在线看| 色播亚洲视频在线观看| 免费A级毛片无码A| 久久精品免费观看国产| 亚洲欧洲无卡二区视頻| 久久精品国产99精品国产亚洲性色|