我正在遵循我在网上找到的不同教程,在ReactJS中使用"上下文",但当我想更新子页面中的上下文时,我无法使其发挥作用.我用来作为基础的代码来自这里:https://www.taniarascia.com/using-context-api-in-react/ 我使用类组件,下面是我所拥有的:

上下文的组件:

import React, { Component } from 'react'

const UserContext = React.createContext()

class UserProvider extends Component {
  // Context state
  state = {
    user: {},
  }

  // Method to update state
  setUser = (user) => {
    this.setState((prevState) => ({ user }))
  }

  render() {
    const { children } = this.props
    const { user } = this.state
    const { setUser } = this

    return (
      <UserContext.Provider
        value={{
          user,
          setUser,
        }}
      >
        {children}
      </UserContext.Provider>
    )
  }
}

export default UserContext
export { UserProvider }

我的App.js:

import FooterSPA from './components/FooterSPA/FooterSPA'

import UserContext, {UserProvider}  from './components/Context/UserContext'

// This component is the application entry point
class App extends Page {

  render() {

    const user = { lastname: 'langlois', firstname:"h", loggedIn: true }
    //const {user, setUser} = useState({ lastname: 'langlois', firstname:"hugo", loggedIn: true });

    return (
      <UserContext.Provider value={user}>
          {this.childComponents}
          {this.childPages}
          <FooterSPA homePath={this.props.locationPathname}/>
      </UserContext.Provider>
    );
  }
}

export default withModel(App);

最后,我try 执行FooterSPA操作的组件:

import React, {Component} from 'react';
import {Link} from 'react-router-dom';

import UserContext from '../Context/UserContext'

require('./FooterSPA.css');

export default class Footer extends Component {

  static contextType = UserContext

  render() {

    console.log(this.context);

    const { user, setUser } = this.context

    return (
        <div>
            <button
              onClick={() => {
                const newUser = { name: 'Joe', loggedIn: true }
                setUser(newUser)
              }}
            >
              Update User
            </button>
            <div className="footerspa">
                <div className="footercontainer">
                    <Link to={this.props.homePath}>Back to Home Page</Link>
                </div>
            </div>
        </div>
    );
  }
}

我一直有一个错误,说在FooterSP.js中,"setUser"不是一个函数. 我试图使用"this.setUser"或"this.context.setUser",但它们是一样的. 我的react 非常 fresh ,我想我错过了一些明显的东西,但我找不到什么. 此外,我不确定我创建的Conext.js组件是如何工作的,所以这很难,所以请为我排除故障.

希望有人能帮到我,提前谢谢! HL

我试着更改我的App.js,或者传递函数,但我对Reaction一无所知,因此我甚至不知道如何开始

推荐答案

Issue

App呈现differentUserContext.Provider组件并传递user作为上下文值,例如,this.context = { lastname: 'langlois', firstname:"h", loggedIn: true }在消费组件中.在此提供的上下文值中没有setUser个函数.

class App extends Page {
  render() {
    const user = { lastname: 'langlois', firstname:"h", loggedIn: true }
    //const {user, setUser} = useState({ lastname: 'langlois', firstname:"hugo", loggedIn: true });

    return (
      <UserContext.Provider value={user}> // <-- no "setUser" property
        {this.childComponents}
        {this.childPages}
        <FooterSPA homePath={this.props.locationPathname} />
      </UserContext.Provider>
    );
  }
}

解决方案

或者在App中创建状态,并通过消费者的期望:

class App extends Page {
  state = {
    lastname: 'langlois',
    firstname: "hugo",
    loggedIn: true
  }

  render() {
    return (
      <UserContext.Provider
        value={{ user: this.state, setUser: this.setState }}
      >
        {this.childComponents}
        {this.childPages}
        <FooterSPA homePath={this.props.locationPathname} />
      </UserContext.Provider>
    );
  }
}

或者从第一个代码段导入并呈现UserProvider.

import FooterSPA from './components/FooterSPA/FooterSPA'
import { UserProvider }  from './components/Context/UserContext';

class App extends Page {
  render() {
    return (
      <UserProvider> // <-- provides { user, setUser }
        {this.childComponents}
        {this.childPages}
        <FooterSPA homePath={this.props.locationPathname} />
      </UserProvider>
    );
  }
}

export default withModel(App);

Javascript相关问答推荐

Flisk和JS错误:未捕获的Syntax错误:意外的令牌'<'

如何使用JavaScript用等效的功能性HTML替换标记URL格式?

如何在JavaScript中在文本内容中添加新行

没有输出到带有chrome.Devtools扩展的控制台

if/else JavaScript中的条件行为

如何在Obsidian dataview中创建进度条

使用Java脚本根据按下的按钮更改S文本

ChartJs未呈现

以Angular 实现ng-Circle-Progress时出错:模块没有导出的成员

在数组中查找重叠对象并仅返回那些重叠对象

向数组中的对象添加键而不改变原始变量

P5.js中的分形树

在渲染turbo流之后滚动到元素

顶点图使用组标签更新列之间的条宽

使用API调用的VUE 3键盘输入同步问题

如何压缩图像并将其编码为文本?

ReactJS Sweep Line:优化SciChartJS性能,重用wasmContext进行多图表渲染

如何从嵌套的json中获取最大值

检测带有委托的元素内部的点击,以及元素何时按其类名被选中

与find()方法一起使用时,Mongoose中的$or运算符没有提供所有必需的数据