当前位置: 首页 > 知识库问答 >
问题:

javascript - React如何在类组件中订阅context的变化?

皇甫波峻
2023-07-25
class A {    static contextType = BaseContext;    componentDidMount(){        // 根据BaseContext初始化一些内容        this.doSomething();    }    doSomething(){        // BaseContext 的值可能会变,需要在context值变化后执行这个函数        this.name = this.context.name        this.setState({            age: this.context.age        })    }}

问题:

  1. BaseContext 的值可能会变,如何在context值变化后执行doSomething函数?官方说这个情况怎么做,这个是不是需要自己实现一个订阅函数传到子组件内?
  2. 类组件中有类似于cpomputed(计算属性)的概念吗?上面的例子中可以转化为计算属性来优化吗?

共有1个答案

令狐运珧
2023-07-25

用Context.Consumer

import React from 'react';import { BaseContext } from './BaseContext';class A extends React.Component {  doSomething = (context) => {    this.name = context.name;    this.setState({      age: context.age,    });  }  render() {    return (      <BaseContext.Consumer>        {context => {          this.doSomething(context);          return <div>Your component content</div>;        }}      </BaseContext.Consumer>    );  }}

react类里面没有计算属性,可以用funtion,除了老项目现在都是用funtion,加hook,你可以自定以一个hooks,不过可以通过class得get方法,可以依赖于props或者state:

class Demo extends React.Component {    constructor(props) {        super(props)        this.state = {            count: 1        }    }    get otherCount() {        return this.state.count + 1    }    render() {        return <div>{this.otherCount}</div>    }}

直接在render方法里面写,因为state和props的改变会触发render的执行

class Demo extends React.Component {    constructor(props) {        super(props)        this.state = {            count: 1        }    }    render() {        return <div>{this.state.count + 1}</div>    }}

function组件可以使用useMemo

import React, { useState, useMemo } from 'react';function Demo() {  const [count, setCount] = useState(0);  const double = useMemo(() => {    return count * 2;  }, [count])  return (    <div>      {double}    </div>  )}

转自:react实现计算属性

 类似资料:
  • 我有一些“ChangeMainItem”操作(在我的例子中,它是由外部系统或可能的组件之一调度的)。此操作(例如)仅更新reducer中状态的一个属性(例如)。 我的组件A和B需要对此状态更改做出反应:显示加载指示器、获取其他数据并显示结果。顺序动作可以通过一些异步动作库来完成,但是我应该把调度异步动作放在哪里呢?显然,我不能在组件A和B的reducer中分派异步操作,我也不想将原始操作更改为异步

  • 请帮助我订阅更改的变量。我做了简单的微调。服务中的微调状态(真|假)存储: 在组件模板中,我通过条件显示微调器: 在组件中,我尝试订阅服务isVisibleSpinner变量中的更改: 但控制台输出遵循错误消息: 类型“boolean”不可分配给类型“Observable”。

  • 我正在学习Angular 5+,最近来到主题/订阅部分,我看到很多教程都希望以特定的方式使用订阅: 在组件中声明订阅 通过服务的主题或ngrx/store在ngOnInit中订阅 在ngondestroy中取消订阅 null

  • 我在IBM cloud IoT平台上有一个设备,我想订阅mendix的活动...我正在使用MQTT客户端表单mendix应用商店订阅设备事件。 项目资源管理器: MQTT订阅

  • 问题内容: 我在上下文中有如下语言设置 我的应用程序代码如下所示 我的页面具有切换语言的组件 在这种情况下,需要更新上下文以将语言更改为“ jp”,如下所示 如何从LanguageSwitcher组件内部更新上下文? 问题答案: 挂钩是在16.8.0中引入的,因此以下代码要求最低版本为16.8.0(向下滚动以获得类组件示例)。CodeSandbox演示 1.为动态上下文设置父状态 首先,为了拥有可

  • mysql会员订阅数据表的设计应该如何设计?产品有订阅商品和非订阅的,每次都只能购买一个。 订阅有1个月 3个月的 每次到期自动扣费。如果在一个月类购买了几个订阅商品 则扣费按照最新的一个 然后延长到期时间。其实是不是每次订阅都不需要生成新订单的 翻阅了其他资料都找不到很好的设计