亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-15 03:37:26 來源:腳本之家 閱讀:123 作者:yesmeck 欄目:web開發

在使用 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 組件庫,需要管理一個復雜組件的狀態,不妨試試這個優化方式。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

红桥区| 新邵县| 云和县| 北流市| 威海市| 商都县| 安宁市| 邹平县| 霸州市| 济宁市| 阿巴嘎旗| 诸城市| 鲜城| 望奎县| 莱阳市| 玉溪市| 巧家县| 三门县| 绍兴县| 饶河县| 遂川县| 乌拉特前旗| 武义县| 武强县| 乐都县| 湟源县| 辰溪县| 招远市| 嘉黎县| 陆川县| 前郭尔| 信宜市| 德兴市| 景洪市| 莲花县| 延川县| 舞钢市| 安顺市| 灵寿县| 西华县| 隆回县|