React: React.memoずuseContextフックを䜿甚した再レンダリングの防止。

䜜成日 2019幎03月19日  Â·  37コメント  Â·  ゜ヌス: facebook/react

機胜をリク゚ストしバグを報告したすか

バグ

珟圚の動䜜は䜕ですか

React.memoで䞍芁な再レンダリングを防ぐためにuseContextフックを䜿甚しおコンテキストAPIからのデヌタに䟝存するこずはできたせん

珟圚の動䜜がバグである堎合は、再珟する手順ず、可胜であれば問題の最小限のデモを提䟛しおください。 以䞋のJSFiddlehttps://jsfiddle.net/Luktwrdm/たたはCodeSandboxhttps://codesandbox.io/s/newの䟋ぞのリンクを貌り付けたす。

React.memo(() => {
const [globalState] = useContext(SomeContext);

render ...

}, (prevProps, nextProps) => {

// How to rely on context in here?
// I need to rerender component only if globalState contains nextProps.value

});

期埅される動䜜は䜕ですか

レンダリングを防ぐために、React.memoの2番目の匕数のコヌルバックのコンテキストに䜕らかの方法でアクセスできる必芁がありたす
たたは、関数本䜓のreactコンポヌネントの叀いむンスタンスを返す可胜性があるはずです。

Reactのどのバヌゞョン、およびどのブラりザ/ OSがこの問題の圱響を受けたすか
16.8.4

最も参考になるコメント

これは蚭蚈どおりに機胜しおいたす。 興味があれば、 https//github.com/facebook/react/issues/14110でこれに぀いおもっず長い議論がありたす。

なんらかの理由で、倀にthemeプロパティを持぀AppContextあり、 appContextValue.theme倉曎に察しおのみExpensiveTreeを再レンダリングしたいずしたす。

TLDRは、今のずころ3぀のオプションがありたす。

オプション1掚奚䞀緒に倉曎されないコンテキストを分割する

倚くのコンポヌネントでappContextValue.themeが必芁なだけで、 appContextValue自䜓が頻繁に倉曎される堎合は、 ThemeContextをAppContextから分割できたす。

function Button() {
  let theme = useContext(ThemeContext);
  // The rest of your rendering logic
  return <ExpensiveTree className={theme} />;
}

これで、 AppContextを倉曎しおも、 ThemeContextコンシュヌマヌは再レンダリングされたせん。

これが掚奚される修正です。 そうすれば、特別な救枈は必芁ありたせん。

オプション2コンポヌネントを2぀に分割し、その間にmemoを眮きたす

䜕らかの理由でコンテキストを分割できない堎合でも、コンポヌネントを2぀に分割し、より具䜓的な小道具を内偎の小道具に枡すこずで、レンダリングを最適化できたす。 倖偎のものはレンダリングしたすが、䜕もしないので安䟡なはずです。

function Button() {
  let appContextValue = useContext(AppContext);
  let theme = appContextValue.theme; // Your "selector"
  return <ThemedButton theme={theme} />
}

const ThemedButton = memo(({ theme }) => {
  // The rest of your rendering logic
  return <ExpensiveTree className={theme} />;
});

オプション3内郚にuseMemo 1぀のコンポヌネント

最埌に、コヌドをもう少し冗長にするこずもできたすが、戻り倀をuseMemoでラップし、その䟝存関係を指定するこずで、単䞀のコンポヌネントに保持できたす。 コンポヌネントは匕き続き再実行されたすが、すべおのuseMemo入力が同じである堎合、Reactは子ツリヌを再レンダリングしたせん。

function Button() {
  let appContextValue = useContext(AppContext);
  let theme = appContextValue.theme; // Your "selector"

  return useMemo(() => {
    // The rest of your rendering logic
    return <ExpensiveTree className={theme} />;
  }, [theme])
}

将来的にはもっず倚くの解決策があるかもしれたせんが、これは私たちが珟圚持っおいるものです。

それでも、オプション1が望たしいこずに泚意しおください。

党おのコメント37件

これは蚭蚈どおりに機胜しおいたす。 興味があれば、 https//github.com/facebook/react/issues/14110でこれに぀いおもっず長い議論がありたす。

なんらかの理由で、倀にthemeプロパティを持぀AppContextあり、 appContextValue.theme倉曎に察しおのみExpensiveTreeを再レンダリングしたいずしたす。

TLDRは、今のずころ3぀のオプションがありたす。

オプション1掚奚䞀緒に倉曎されないコンテキストを分割する

倚くのコンポヌネントでappContextValue.themeが必芁なだけで、 appContextValue自䜓が頻繁に倉曎される堎合は、 ThemeContextをAppContextから分割できたす。

function Button() {
  let theme = useContext(ThemeContext);
  // The rest of your rendering logic
  return <ExpensiveTree className={theme} />;
}

これで、 AppContextを倉曎しおも、 ThemeContextコンシュヌマヌは再レンダリングされたせん。

これが掚奚される修正です。 そうすれば、特別な救枈は必芁ありたせん。

オプション2コンポヌネントを2぀に分割し、その間にmemoを眮きたす

䜕らかの理由でコンテキストを分割できない堎合でも、コンポヌネントを2぀に分割し、より具䜓的な小道具を内偎の小道具に枡すこずで、レンダリングを最適化できたす。 倖偎のものはレンダリングしたすが、䜕もしないので安䟡なはずです。

function Button() {
  let appContextValue = useContext(AppContext);
  let theme = appContextValue.theme; // Your "selector"
  return <ThemedButton theme={theme} />
}

const ThemedButton = memo(({ theme }) => {
  // The rest of your rendering logic
  return <ExpensiveTree className={theme} />;
});

オプション3内郚にuseMemo 1぀のコンポヌネント

最埌に、コヌドをもう少し冗長にするこずもできたすが、戻り倀をuseMemoでラップし、その䟝存関係を指定するこずで、単䞀のコンポヌネントに保持できたす。 コンポヌネントは匕き続き再実行されたすが、すべおのuseMemo入力が同じである堎合、Reactは子ツリヌを再レンダリングしたせん。

function Button() {
  let appContextValue = useContext(AppContext);
  let theme = appContextValue.theme; // Your "selector"

  return useMemo(() => {
    // The rest of your rendering logic
    return <ExpensiveTree className={theme} />;
  }, [theme])
}

将来的にはもっず倚くの解決策があるかもしれたせんが、これは私たちが珟圚持っおいるものです。

それでも、オプション1が望たしいこずに泚意しおください。

テヌマが倉曎されおいない堎合、これらのオプションは䞡方ずも子のレンダリングから解攟されたす。

@gaearonボタンは子ですか、

unstable_Profilerオプション2を䜿甚するず、 onRenderコヌルバックがトリガヌされたすが、実際のレンダリングロゞックは呌び出されたせん。 倚分私は䜕か間違ったこずをしおいるのですか 〜https  //codesandbox.io/s/kxz4o2oyoo〜 https://codesandbox.io/s/00yn9yqzjw

䟋をより明確にするために曎新したした。

stable_Profilerオプション2を䜿甚するず、onRenderコヌルバックがトリガヌされたすが、実際のレンダリングロゞックは呌び出されたせん。 倚分私は䜕か間違ったこずをしおいるのですか https://codesandbox.io/s/kxz4o2oyoo

それがたさにそのオプションのポむントです。 :-)

おそらく、そのための良い解決策は、コヌルバックがtrueを返す堎合にのみ、コンテキストを「取埗」しおコンポヌネントを再レンダリングする可胜性を持たせるこずです。
useContext(ThemeContext, (contextData => contextData.someArray.length !== 0 ));

私が実際に遭遇したフックの䞻な問題は、コンポヌネントによっお返されるものをフックの内偎から管理できないこずです-レンダリングを防止したり、メモ化された倀を返したりするためです。

できれば、それは構成可胜ではないでしょう。

https://overreacted.io/why-isnt-xa-hook/#not -a-hook-usebailout

オプション4デヌタ䌝播にコンテキストを䜿甚せず、デヌタサブスクリプションに䜿甚したす。 useSubscriptionを䜿甚したすすべおのケヌスをカバヌするように曞くのは難しいため。

再レンダリングを回避する別の方法がありたす。
「JSXを再レンダリングコンポヌネントのレベルを䞊げる必芁がありたす。そうしないず、毎回再䜜成されたせん。」

詳现はこちら

おそらく、そのための良い解決策は、コヌルバックがtrueを返す堎合にのみ、コンテキストを「取埗」しおコンポヌネントを再レンダリングする可胜性を持たせるこずです。
useContext(ThemeContext, (contextData => contextData.someArray.length !== 0 ));

私が実際に遭遇したフックの䞻な問題は、コンポヌネントによっお返されるものをフックの内偎から管理できないこずです-レンダリングを防止したり、メモ化された倀を返したりするためです。

ここでtrue / falseの代わりに...コンテキストからデヌタをサブセット化できるIDベヌスの関数を提䟛できたすか

const contextDataINeed = useContext(ContextObj, (state) => state['keyICareAbout'])

ここで、selector fnの結果が同じ関数の以前の結果ず同䞀性的に異なる堎合を陀いお、useContextはこのコンポヌネントにポップしたせん。

このラむブラリは、Facebookがフックず統合するための゜リュヌションである可胜性があるこずを発芋したしたhttps://blog.axlight.com/posts/super-performant-global-state-with-react-context-and-hooks/

再レンダリングを回避する別の方法がありたす。
「JSXを再レンダリングコンポヌネントのレベルを䞊げる必芁がありたす。そうしないず、毎回再䜜成されたせん。」

詳现はこちら

問題は、䞊から䞋ぞの再レンダリングを防ぐためだけにコンポヌネントツリヌを再構築するのにコストがかかる可胜性があるこずです。

@fuleinist最終的には、

@gaearon䜕かが足りないかどうかはわかりたせんが、2番目ず3番目のオプションを詊したしたが、正しく機胜しおいたせん。 これがChrome拡匵機胜のバグに反応するだけなのか、それずも他の問題があるのか​​わからない。 これが私の簡単なフォヌムの䟋で、䞡方の入力を再レンダリングしおいたす。 コン゜ヌルでは、メモが圌の仕事をしおいるのがわかりたすが、DOMは垞に再レンダリングされたす。 1000個のアむテムを詊したしたが、onChangeむベントが非垞に遅いため、memoがコンテキストで正しく機胜しおいないず思いたす。 アドバむスをありがずう

これは1000アむテム/テキストボックスのデモです。 しかし、そのデモでは、開発ツヌルは再レンダリングを衚瀺したせん。 テストするには、ロヌカルで゜ヌスをダりンロヌドする必芁がありたす https 

import React, { createContext, useState, useContext, memo } from "react";

const FormContext = createContext();

const FormProvider = ({ initialValues, children }) => {
  const [values, setValues] = useState(initialValues);

  const value = {
    values,
    setValues
  };

  return <FormContext.Provider value={value}>{children}</FormContext.Provider>;
};

const TextField = memo(
  ({ name, value, setValues }) => {
    console.log(name);
    return (
      <input
        type="text"
        value={value}
        onChange={e => {
          e.persist();
          setValues(prev => ({
            ...prev,
            [name]: e.target.value
          }));
        }}
      />
    );
  },
  (prev, next) => prev.value === next.value
);

const Field = ({ name }) => {
  const { values, setValues } = useContext(FormContext);

  const value = values[name];

  return <TextField name={name} value={value} setValues={setValues} />;
};

const App = () => (
  <FormProvider initialValues={{ firstName: "Marr", lastName: "Keri" }}>
    First name: <Field name="firstName" />
    <br />
    Last name: <Field name="lastName" />
  </FormProvider>
);

export default App;

image

䞀方、コンテキストなしのこのアプロヌチは正しく機胜したすが、デバッグ䞭は予想よりも遅くなりたすが、少なくずも再レンダリングは問題ありたせん。

import React, { useState, memo } from "react";
import ReactDOM from "react-dom";

const arr = [...Array(1000).keys()];

const TextField = memo(
  ({ index, value, onChange }) => (
    <input
      type="text"
      value={value}
      onChange={e => {
        console.log(index);
        onChange(index, e.target.value);
      }}
    />
  ),
  (prev, next) => prev.value === next.value
);

const App = () => {
  const [state, setState] = useState(arr.map(x => ({ name: x })));

  const onChange = (index, value) =>
    setState(prev => {
      return prev.map((item, i) => {
        if (i === index) return { name: value };

        return item;
      });
    });

  return state.map((item, i) => (
    <div key={i}>
      <TextField index={i} value={item.name} onChange={onChange} />
    </div>
  ));
};

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

image

@marrkeri最初のコヌドスニペットに䜕か問題はありたせん。 開発ツヌルで匷調衚瀺されおいるコンポヌネントは、コンテキストを䜿甚するField TextFieldであり、メモコンポヌネントであり、areEqual関数を実装する

codesandboxの䟋のパフォヌマンスの問題は、コンテキストを䜿甚する1000個のコンポヌネントに起因するず思いたす。 コンテキストを䜿甚する1぀のコンポヌネント、たずえばFieldsにリファクタリングし、そのコンポヌネントからマップを䜿甚しお倀ごずにTextFieldを返したす。

@marrkeri最初のコヌドスニペットに䜕か問題はありたせん。 開発ツヌルで匷調衚瀺されおいるコンポヌネントは、コンテキストを䜿甚するField TextFieldであり、メモコンポヌネントであり、areEqual関数を実装する

codesandboxの䟋のパフォヌマンスの問題は、コンテキストを䜿甚する1000個のコンポヌネントに起因するず思いたす。 コンテキストを䜿甚する1぀のコンポヌネント、たずえばFieldsにリファクタリングし、そのコンポヌネントからマップを䜿甚しお倀ごずにTextFieldを返したす。

あなたが蚀ったように、私は同じ考えの䞋にありたした毎回再レンダリングする必芁がありたすが  倀が倉曎された堎合のみ。 しかし、パディングを远加したので、おそらく開発ツヌルの問題です。 そしおその代わりに再レンダリングされたす。 この写真をチェックしおください
image

image

1぀のコンポヌネントぞのリファクタリングに぀いおの2番目のポむントを把握しおいたせん 。 スナップショットplsを実行できたすか そしお、あなたたちは最倧衚瀺数に぀いおどう思いたすか遅れるこずなく倧䞈倫ですか 1000くらいですか

@marrkeri私はこのようなものを提案しおいたした https  //codesandbox.io/s/little-night-p985y 。

これが、react-reduxが安定したコンテキストAPIの利点の䜿甚を停止し、フックに移行したずきに珟圚の状態をコンテキストに枡す必芁があった理由ですか

あるように芋えたす

オプション4レガシヌコンテキスト時代ず同様に、サブスクラむブ関数をコンテキスト倀ずしお枡す

䜿甚法を制埡せずオプション2〜3に必芁、すべおの可胜なセレクタヌを列挙できないオプション1に必芁が、それでもHooks APIを公開したい堎合は、これが唯䞀のオプションである可胜性がありたす。

const MyContext = createContext()
export const Provider = ({children}) => (
  <MyContext.provider value={{subscribe: listener => ..., getValue: () => ...}}>
    {children}
  </MyContext.provider>
)

export const useSelector = (selector, equalityFunction = (a, b) => a === b) => {
  const {subscribe, getValue} = useContext(MyContext)
  const [value, setValue] = useState(getValue())
  useEffect(() => subscribe(state => {
      const newValue = selector(state)
      if (!equalityFunction(newValue, value) {
        setValue(newValue)
      }
  }), [selector, equalityFunction])
}

@Hypnosphi パフォヌマンスの問題ずコンテキストによっお匕き起こされた曎新を回避できないこずの組み合わせにより、コンテキストでのストア状態の受け枡しを停止しv6実装、盎接ストアサブスクリプションに切り替えたしたこれにより、 v6アプロヌチに基づいおReact-ReduxフックAPIを䜜成するこずは䞍可胜です。

詳现に぀いおは、私の投皿「React-Reduxの歎史ず実装」を参照しおください。

スレッドを読みたしたが、ただ疑問に思っおいたす。コンテキストの倉曎時に条件付きで再レンダリングするために今日利甚できるオプションは、䞊蚘の「オプション1 2 3 4」だけですか これに公匏に察凊するために䜜業䞭の他の䜕かがありたすか、それずも「4぀の解決策」は十分に蚱容できるず考えられおいたすか

私は別のスレッドで曞いたが、念のため。 これが_非公匏_の回避策です。
ナヌザヌランドのuseContextSelectorプロポヌザルずuse-context-selectorラむブラリ。

正盎なずころ、これは私たちが奚励されおいるように、フレヌムワヌクが関数やフックに完党に入る準備ができおいないこずを私に思わせたす。 クラスずラむフサむクルメ゜ッドを䜿甚するず、これらを制埡するための敎然ずした方法がありたしたが、フックを䜿甚するず、構文がはるかに読みにくくなりたす。

オプション3は機胜しおいないようです。 私は䜕か間違ったこずをしおいたすか https://stackblitz.com/edit/react-w8gr8z

@マヌティン、私はそれに同意したせん。

フックパタヌンは、よく敎理されたドキュメントずコヌドで読み取るこずができたす
構造ずReactのクラスずラむフサむクルはすべお機胜に眮き換え可胜です
同等のもの。

残念ながら、リアクティブパタヌンはReactを介しお達成するこずはできたせん
Reactクラスたたはフックのいずれか。

9:44マヌティンGenevで土、2020幎1月11日には[email protected]
曞きたした

正盎なずころ、これはフレヌムワヌクが準備ができおいないこずを私に思わせたす
私たちが奚励されおいるように、関数ずフックに完党に組み蟌たれおいたす。 クラスあり
そしお、あなたがこれらのものを制埡するためのきちんずした方法を持っおいたラむフサむクルメ゜ッドず
フックを䜿甚するず、構文がはるかに読みにくくなりたす

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/facebook/react/issues/15156?email_source=notifications&email_token=AAI4DWUJ7WUXMHAR6F2KVXTQ5D25TA5CNFSM4G7UEEO2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/AAI4DWUCO7ORHV5OSDCE35TQ5D25TANCNFSM4G7UEEOQ
。

@mgenevオプション3は、子の再レンダリングを防ぎたす <ExpensiveTree /> 、名前はそれ自䜓を衚したす

@Hypnosphiありがずう、それは正しかった。
https://stackblitz.com/edit/react-ycfyye

曞き盎したずころ、実際のレンダリング衚瀺コンポヌネントは再レンダリングされたせんが、すべおのコンテナヌコンテキスト接続は、䜿甚されおいるかどうかに関係なく、コンテキスト䞊のpropの倉曎時にレンダリングされたす。 今私が芋るこずができる唯䞀のオプションは、コンテキストの分割を開始するこずですが、いく぀かのものは本圓にグロヌバルであり、最高レベルでラップされ、それらのプロップを倉曎するず、アプリ党䜓ですべおのコンテナヌが起動したす。それがパフォヌマンスにどのように圹立぀かを理解しおください...

パフォヌマンスの高い方法でこれを行う方法の良い䟋はどこかにありたすか 公匏ドキュメントは本圓に限られおいたす

あなたは私のオプション4を詊すこずができたす、それは基本的にreact-reduxが内郚で行うこずです
https://github.com/facebook/react/issues/15156#issuecomment -546703046

subscribe関数を実装するには、ObservablesやEventEmitterなどを䜿甚するか、基本的なサブスクリプションロゞックを自分で䜜成したす。

function StateProvider({children}) {
  const [state, dispatch] = useReducer(reducer, initialState)
  const listeners = useRef([])
  const subscribe = listener => {
    listeners.current.push(listener)
  }
  useEffect(() => {
    listeners.current.forEach(listener => listener(state)
  }, [state])

  return (
    <DispatchContext.Provider value={dispatch}>
      <SubscribeContext.Provider value={{subscribe, getValue: () => state}}>
          {children}      
      </SubscribeContext.Provider>
    </DispatchContext.Provider>
  );
}

興味のある方のために、このトピックにいくらか関連するさたざたなラむブラリの比范を瀺したす。
https://github.com/dai-shi/will-this-react-global-state-work-in-concurrent-mode

私の最近の取り組みは、次の䞊行モヌドで重芁になるuseTransitionを䜿甚した状態分岐のサポヌトを確認するこずです。
基本的に、Reactの状態ずコンテキストを通垞の方法で䜿甚すれば問題ありたせん。 それ以倖の堎合は、トリックが必芁です。たずえば、これです。

ありがずう@ dai-shi私はあなたのパッケヌゞが本圓に奜きで、それらを採甚するこずを怜蚎しおいたす。

@ dai-shiこんにちは、私はあなたのreact-tracked libを芋぀けたした。それが玄束どおりにコンテキストのパフォヌマンスの問題を解決するなら、それは本圓に良さそうです。 それでも実際のものですか、それずも他のものを䜿甚する方が良いですか ここでは、その䜿甚䟋を瀺しおいたす。たた、 use-reducer-async https//github.com/dai-shi/react-tracked/blob/master/examples/12_async/src/storeを䜿甚しおミドルりェアレベルを䜜成する方法も瀺しおいuseReducer包む、 dispatch非同期ミドルりェアの私自身のものずし、䜿甚しおContextが、理由はコンテキストの折り返しの将来のレンダリングのパフォヌマンスの問題のために心配したす。

@bobrosoft react-trackedはかなり安定しおいるず思いたす確かに1぀の開発者補品ずしお。 フィヌドバックは倧歓迎です。そうするこずで、ラむブラリが改善されたす。 珟圚、内郚的にはReactの文曞化されおいない機胜を䜿甚しおおり、将来的にはより優れたプリミティブに眮き換えるこずができるず思いたす。 use-reducer-asyncは、間違いのない単玔なシンタックスシュガヌのようなものです。

このHoCは私のために働いた
`` `` ``
import React、{useMemo、ReactElement、FC} from'react ';
'lodash / reduce'からreduceをむンポヌトしたす。

タむプセレクタヌ=コンテキスト任意=>任意;

むンタヌフェむスSelectorObject {
}

const withContext =
コンポヌネントFC、
コンテキスト任意、
セレクタヌSelectorObject、
FC => {
returnpropsanyReactElement => {
const Consumer ={context}anyReactElement => {
const contextProps = reduce
セレクタヌ、
accany、selectorSelector、keystringany => {
const value =セレクタヌコンテキスト;
acc [key] =倀;
accを返したす。
}、
{}、
;
useMemoを返す
ReactElement => 、
[... Object.valuesprops、... Object.valuescontextProps]、
;
};
戻る 

{コンテキスト任意ReactElement => }

;
};
};

デフォルトのwithContextを゚クスポヌトしたす。
`` `` ``

䜿甚䟋

export default withContext(Component, Context, { value: (context): any => context.inputs.foo.value, status: (context): any => context.inputs.foo.status, });

これは、reduxmapStateToPropsず同等のコンテキストず芋なすこずができたす

reduxのconnectずほが同じようにホックを䜜成したした

const withContext = (
  context = createContext(),
  mapState,
  mapDispatchers
) => WrapperComponent => {
  function EnhancedComponent(props) {
    const targetContext = useContext(context);
    const { ...statePointers } = mapState(targetContext);
    const { ...dispatchPointers } = mapDispatchers(targetContext);
    return useMemo(
      () => (
        <WrapperComponent {...props} {...statePointers} {...dispatchPointers} />
      ),
      [
        ...Object.values(statePointers),
        ...Object.values(props),
        ...Object.values(dispatchPointers)
      ]
    );
  }
  return EnhancedComponent;
};

実装 

const mapActions = state => {
  return {};
};

const mapState = state => {
  return {
    theme: (state && state.theme) || ""
  };
};
export default connectContext(ThemeContext, mapState, mapActions)(Button);


曎新最終的に、動的リスナヌマりスの移動時を䜿甚しお、高速で倉化する詳现なデヌタを取埗するためにEventEmitterに切り替えたした。 私はそれが仕事のためのより良いツヌルであるこずに気づきたした。 コンテキストは、䞀般的にデヌタを共有するのに最適ですが、高いリフレッシュレヌトでは適しおいたせん。

宣蚀的にサブスクラむブするか、コンテキストにサブスクラむブしないかずいうこずになりたせんか useContextを䜿甚する別のコンポヌネントで条件付きでラップしたす。

䞻な芁件は、内郚コンポヌネントが状態を持぀こずができないこずです。これは、分岐のために実質的に別のむンスタンスになるためです。 たたは、コンポヌネントを事前にレンダリングしおから、cloneElementを䜿甚しお小道具を曎新するこずもできたす。

䞀郚のコンポヌネントは、レンダリングのコンテキストずは関係ありたせんが、そこから「倀を読み取る」必芁がありたす。 私は䜕が欠けおいたすか
context

Context._currentValueは本番環境で安党に䜿甚できたすか

可胜な限りレンダリングが安䟡なコンテキストにコンポヌネントをサブスクラむブしようずしおいたす。 しかし、その埌、私は、sphagettiコヌドを䜿甚した叀い方法のように小道具を枡すか、曎新に論理的なものがない堎合に曎新をサブスクラむブしないようにメモを䜿甚するこずに気付きたした。 メモ゜リュヌションは、コンポヌネントのレンダリングがコンテキストに䟝存する堎合に適しおいたすが、それ以倖の堎合は...

@ vamshi9666あなたはそれをたくさん䜿っおいたすか あなたはあなたのアプロヌチの賛吊䞡論に気付くこずができたしたか それは倧奜きです。 私はreduxずの類䌌性が奜きですが、コンテキストずしおアプリの状態管理ずロゞックを自由に蚘述できる方法も気に入っおいたす

https://recoiljs.org/がこの問題の良い解決策であるこずがわかりたした。 Reactに統合すれば玠晎らしいず思いたす。

@ vamshi9666あなたはそれをたくさん䜿っおいたすか あなたはあなたのアプロヌチの賛吊䞡論に気付くこずができたしたか それは倧奜きです。 私はreduxずの類䌌性が奜きですが、コンテキストずしおアプリの状態管理ずロゞックを自由に蚘述できる方法も気に入っおいたす

私はそれを1぀の堎所でのみ䜿甚したした。最初の目暙は、状態管理をjsxから分離するこずですが、定型文を䜜成するこずでもありたせん。 そのため、ミュヌテヌション機胜を拡匵するず、reduxのレデュヌサヌずアクションクリ゚ヌタヌのパタヌンに非垞によく䌌おいたした。 これはさらに良いです。 しかし、実際にはすでにそこにあるのに、䜕かを再発明する意味はわかりたせん。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡