質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1199閲覧

React: Contextでレンダリングを減らしたい。

2_34_koki

総合スコア67

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

1クリップ

投稿2021/07/08 13:25

ReactのContextを利用しているんですが、なぜかレンダリング回数が減らせません。 レンダリング回数を減らすために、参照系更新系を分けてProviderを作成しました。valueに値を渡すところで、value={{ hoge }}の形で渡すと、2つのコンポーネント両方でレンダリングが発生します。
value={ hoge }の形だと、Countコンポーネントのみがレンダリングされて期待した動作が確認できました。
なぜ、前者の書き方だとレンダリングが両方で発生するのでしょうか?

import React, { createContext, useContext, useReducer } from "react"; ​ const CountStateContext = createContext<any>({}); const CountDispatchContext = createContext<any>({}); ​​ function CountProvider({ children }: { children: any }) { const [state, dispatch] = useReducer(countReducer, { count: 0 }); return ( <CountStateContext.Provider value={{ state }}> <CountDispatchContext.Provider value={{ dispatch }}> {children} </CountDispatchContext.Provider> </CountStateContext.Provider> ); } ​ function Count() { console.log("render Count"); const { state } = useContext(CountStateContext); ​ return <h1>{state.count}</h1>; } ​ function Counter() { console.log("render Counter"); const { dispatch } = useContext(CountDispatchContext); ​ return ( <> <button onClick={() => dispatch({ type: "decrement" })}>-</button> <button onClick={() => dispatch({ type: "increment" })}>+</button> </> ); } ​ export default function App() { return ( <CountProvider> <Count /> <Counter /> </CountProvider> ); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

なぜ、前者の書き方だとレンダリングが両方で発生するのでしょうか?

value={{ hoge }}と書くと、その場で{ hoge }というオブジェクトを作成するため、実質的にメモ化が無効となります。

投稿2021/07/08 22:19

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問