使用多个孩子呈现的上下文消费者错误

Posted

技术标签:

【中文标题】使用多个孩子呈现的上下文消费者错误【英文标题】:Error of context consumer rendered with multiple children 【发布时间】:2021-12-25 13:36:00 【问题描述】:

得到错误:

一个上下文消费者被渲染了多个孩子,或者一个孩子 这不是一个功能。上下文消费者期望一个孩子 是一个函数。如果你确实传递了一个函数,请确保没有 它周围的尾随或前导空格。

起初它可以工作,但随后开始出现错误。这是一个vite + tailwindcss + react APP。我得到了无法直接渲染上下文的错误,所以我添加了消费者代码。但后来又出现了这个新错误。

这是我创建的上下文:

import React, useState, createContext from 'react'

// creating the food context
export const FoodContext = createContext()
export const FoodProvider = (props) => 

// state for the details
const [foods, setFoods] = useState([

            title: 'Dougnut',
            source: 'Delicious soft Dougnut',
            price: 500,
            imageUrl: "url('./images/pizza.jpg')",
            id: 1,
            buttonText: 'Order'
        ,
        
            title: 'Pasta',
            source:'Delicous pasta',
            price: 1500,
            imageUrl: '../images/banner.jpg',
            id: 6,
            buttonText: 'Order'
        
    ]);

    return (
        <div>
            <FoodContext.Provider value=[foods, setFoods]>
                props.children
            </FoodContext.Provider>
        </div>
    )

这是我用上下文包装所有内容的 main.js 文件:

import React from 'react'
import ReactDOM from 'react-dom'
import  BrowserRouter  from 'react-router-dom';
import './index.css'
import App from './App'
import  FoodContext  from './components/context/FoodContext';

ReactDOM.render(
   <BrowserRouter>
      <FoodContext.Consumer>
          <App />
      </FoodContext.Consumer>
    </BrowserRouter>,
  document.getElementById('root')
)

这是我的 app.js 文件:

import Switch, Route  from 'react-router-dom';
import FoodProvider from "./components/context/FoodContext";
import HomePage from './components/HomePage';
import NotFound from './components/NotFound';
import Menu from './components/Menu';
import SingleFood from './components/SingleFood';

function App() 
  // const consumer = React.useContext(FoodProvider);
  return (
    <FoodProvider.Consumer>
      <div className="App">
        <Switch>
           <Route exact path='/' component=HomePage />
           <Route path='/menu' component=Menu  />
           <Route path='/food/:id' component=SingleFood  />
           <Route path='*' component=NotFound  />
        </Switch>
      </div>
    </FoodProvider.Consumer>
  );


export default App;

【问题讨论】:

【参考方案1】:

我认为这里有不同的问题:

    我认为您在声明提供者之前使用的是消费者。上下文消费者必须是提供者的孩子(不是直接的)。要了解应如何管理上下文,我建议您先了解一些有关 lifting state up 的知识,然后重新考虑您的实施。 您可以将您的状态传递给提供者,而无需将元素放入列表中。使用:&lt;FoodContext.Provider value=foods, setFoods&gt; 可以让您更好地在子组件中解构上下文。 您对消费者的使用也不尊重您应该如何使用它。正如您从official documentation 中看到的那样,您应该根据消费者值插入一个对象。所以在你的具体情况下,当你想列出你的食物时,你应该有这样的东西:
 <FoodContext.Consumer>
  
    ( foods, setFoods ) => foods.map(food => (
      <div className="food-item">
        <h1>food.title</h1>
        /*The remaining elements of your food component*/
      </div>
    ))
  
</FoodContext.Consumer>

【讨论】:

以上是关于使用多个孩子呈现的上下文消费者错误的主要内容,如果未能解决你的问题,请参考以下文章

React - 上下文提供程序中的多个不相关值

React:如何使用相同类型的多个上下文,同时允许孩子从所有上下文中读取数据

如何在 Django 中将多个上下文呈现为相同的 HTML

反应多个上下文

在重定向之前需要反应上下文来更新

React Context API似乎重新渲染每个组件