【问题标题】:Defining internal class variables inside class methods using Javascript?使用Javascript在类方法中定义内部类变量?
【发布时间】:2018-12-08 23:16:38
【问题描述】:

这个问题实际上与 React JS 相关。是否可以在其中一个类方法中定义内部类变量,然后在其他方法中使用它?我的意思是这样做:

class Something extends React.Component {
  state = {
      value: 'doesnt matter'
  };

  something = () => {
    //a lot is happening in here and at some point I define this.thing
    this.thing = 1;
  }

  increase = () => {
    if(this.thing) {
      this.thing += 1;
    }
  }

  decrease = () => {
    if(this.thing && this.thing > 0) {
      this.thing -= 1;
    }
  }

  render() {
    return (
      <span>this.state.value</span>
    );
  }
}

事情是我不需要把this.thing 作为状态值,因为我只需要在内部。请注意,此代码只是一个示例,实际代码要复杂一些,但主要问题是,可以像我在示例中那样定义类内部变量(this.thing)吗?或者也许我应该以不同的方式做到这一点?最佳做法是什么?

【问题讨论】:

  • 变量“thing”是一个变量类,在这个类中定义的所有方法都可以访问它。如果你在你的状态下对其进行罚款也是一样的: state = { value: "...", thing: null }
  • 你可以查看medium.freecodecamp.org/… 就像你正在做的那样使用this 看起来是一个不错的选择
  • @DaniloAssisNobredosSantos 如果对thing 的更改一定会触发重新渲染,这只是一个好主意——否则,我认为最好将thing 存储在其他地方

标签: javascript reactjs class


【解决方案1】:

使用构造函数做这样的事情没有问题,但是基于react理论和UI渲染这种用法不会重新渲染或遵循触发和重新渲染的react模式,它只会服务器作为与 react 生命周期无关的值的存储。

class Something extends React.Component {
  constructor(props) {
    super(props);
    // Your thing
    this.thing = 0;
    this.state = {
      value: "doesnt matter."
    };
  }

  something = () => {
    //a lot is happening in here and at some point I define this.thing
    this.thing = 1;
  };

  increase = () => {
    if (this.thing) {
      this.thing += 1;
    }
  };

  decrease = () => {
    if (this.thing && this.thing > 0) {
      this.thing -= 1;
    }
  };

  render() {
    this.something();
    console.log(this.thing); // will equal 1.
    return <span>{this.state.value}</span>;
  }
}

【讨论】:

  • 是的,我知道我可以使用构造函数并在那里定义变量,但问题是,是否有必要在构造函数中定义所有 this.something 变量?如果是这样,为什么?关于重新渲染的另一件事,当该值发生变化时,我不需要重新渲染组件,所以我知道这一点。问题仍然存在,在我的示例中使用this.thing 这样的模式是正常做法还是错误? :)
  • 这不是问题,也没有错,最重要的是 React 是 javascript 而 this.{Anything} 是一个有效的类/对象原型。
  • 那么,对于如何以及何时可以定义 this.{anything} 没有规则/最佳实践?
  • 在构造函数中,检查它是如何定义的,以及它是如何在 babel stackoverflow.com/questions/35774928/… 后台翻译的
【解决方案2】:

我不需要把 this.thing 作为状态值,因为我只在内部需要它。

React 组件的 state 也应该只在内部使用。

最佳做法是什么?

您可以使用实例变量 (ivars) 而不是状态来提高性能,因为您可以减轻事件队列的负担。从美学上讲,ivars 通常需要更少的代码。但是状态更新通常是首选,因为它们会触发重新渲染;这种保证使您的代码更容易思考,因为渲染永远不会过时。在您的情况下,渲染函数独立于this.thing,因此可以将其存储在 ivar 中。

一般情况下最好在constructor中初始化ivars,因为它先运行,所以this.thing保证可以被其他方法消费:

constructor(props) {
  super(props);
  this.thing = 0;
}

【讨论】:

  • 我不明白构造函数是如何工作的,我也知道状态工作流。我不确定的是,我可以在任何我想要的地方定义 ivars,还是有一些规则/最佳实践?就像真的有必要在构造函数中定义它们吗?无论如何谢谢你的回答:)
  • 您可以在任何地方初始化 ivars,但如果读取 this.thing 的代码在 this.thing 初始化之前以某种方式运行,您可能会出现意外行为。即使您正确编码,当我(外部贡献者)打开您的代码库时,我也不确定您是否正确。如果你在构造函数中初始化this.thing,这种不确定性就被消除了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多