Реагировать: значение контекста по умолчанию пустое

#reactjs #use-context

#reactjs #использовать-контекст

Вопрос:

Я пытаюсь установить значение по умолчанию через контекст (который я позже обновлю). Однако, похоже, я не могу получить значение у потребителя.

У меня есть SummaryContext файл, который содержит два значения по умолчанию title и summary . Это используется в Body.js и header передается значение. И, наконец Title , файл, который должен отображать одно из значений.

Строка console.log("TITLE.JS: " {title}); в Title.js выводится TITLE.JS: [object Object на консоль.

Я в недоумении относительно того, что я ошибся.

SummaryContext.js

 import { createContext } from 'react'

const header = {
  title: "sdlfkjasdf",
  summary: "kmkmkm"
}

export const SummaryContext = createContext(header);
  

Тело

Строка <WikiHeader > содержит ссылку на файл Title.js , который является файлом, в который я пытаюсь передать эти значения.

 import React, {useState} from "react";
import WikiHeader from './wikiheader/WikiHeader'

import {SummaryContext} from "../contexts/SummaryContext"

function Body() {

    const [header, setHeader] = useState(SummaryContext);

  return (

    <>   
      <SummaryContext.Provider value={{header}}>
        <GoogleAd />
        <WikiHeader />    
      </SummaryContext.Provider>

    </>
  );
}

export default Body;
  

Title.js

 import React, {useContext} from "react"
import {SummaryContext} from "../../../contexts/SummaryContext"
import '../../../App.css'

export function Title() {
  const {title, summary} = useContext(SummaryContext);
  console.log("TITLE.JS: "   {title});

  return (
    <div className="container">
      <div className="detailTitle"><span><h3>The title: {title}</h3></span></div>
    </div>

  );
}
  

Ответ №1:

 const [header, setHeader] = useState(SummaryContext);
  

Эта строка не делает то, что вы хотите. SummaryContext это объект со Consumer свойством и Provider свойством, каждое из которых является компонентом react. Вы хотите что-то вроде этого:

 const [header, setHeader] = useState({
  title: "sdlfkjasdf",
  summary: "kmkmkm"
})
  

Если вы хотите, чтобы это начальное состояние поступало из файла контекста, вы можете, но вам нужно будет экспортировать его, как в:

 import { createContext } from 'react'

export const defaultHeader = {
  title: "sdlfkjasdf",
  summary: "kmkmkm"
}

export const SummaryContext = createContext(defaultHeader);

// used like:

import { defaultHeader } from "../contexts/SummaryContext"

// ...

const [header, setHeader] = useState(defaultHeader);
  

P.S: эта строка вызовет у вас некоторые проблемы:

 <SummaryContext.Provider value={{header}}>
  

Каждый раз при повторных отправках тела для значения будет создаваться совершенно новый объект, что означает, что каждому потребителю потребуется выполнить повторную отправку, даже если заголовок не изменился. Если заголовок — это единственное, что вы предоставляете, я бы рекомендовал сделать:

 <SummaryContext.Provider value={header}>
  

Или, если вам нужно обернуть его в объект, вы должны запомнить этот объект:

 const value = useMemo(() => {
 return { header };
}, [header]);

// ...
<SummaryContext.Provider value={value}>