当前位置: 首页 > 面试题库 >

初始化状态,没有构造函数在反应

夹谷山
2023-03-14
问题内容

import React, { Component } from ‘react’;

class Counter extends Component {
  state = { value: 0 };

  increment = () => {
    this.setState(prevState => ({
      value: prevState.value + 1
    }));
  };

  decrement = () => {
    this.setState(prevState => ({
      value: prevState.value - 1
    }));
  };

  render() {
    return (
      <div>
        {this.state.value}
        <button onClick={this.increment}>+</button>
        <button onClick={this.decrement}>-</button>
      </div>
    )
  }
}

通常我看到的是,如果他使用es6类,人们会在构造函数中执行this.state。如果不是,他可能会使用getinitialstatestate函数放置状态。但是上面的代码(是的,这是一个有效的代码),两者都没有使用。我有2个问题,这里的状态是什么?那是局部变量吗?如果是,为什么没有const?prevState来自哪里?为什么在setState中使用箭头功能?这样做容易this.setState({value:'something'})吗?


问题答案:

关于问题2,请参见Dan的出色解答:在这种情况下,是否需要使用setState(function)重载?

  1. 不,这不是局部变量。与this.state在构造函数中声明相同。

  2. 是的,在这种情况下,您只能使用this.setState({ value: this.state.value + 1 }),结果将是相同的。

但是请注意,使用功能setState可以带来一些好处:

  1. 如果在外部声明setState函数,则可以重用它:
        const increment = prevState => ({
      value: prevState.value + 1
    })

现在,如果您有多个组件需要使用此功能,则只需在任何地方导入和重用逻辑。

    this.setState(increment)
  1. React压扁数个setState并批量执行它们。这可能会导致某些意外行为。请参见以下示例:

http://codepen.io/CodinCat/pen/pebLaZ

        add3 () {
      this.setState({ count: this.state.count + 1 })
      this.setState({ count: this.state.count + 1 })
      this.setState({ count: this.state.count + 1 })
    }

执行此功能的count意志只会加1

如果使用功能性setState:

http://codepen.io/CodinCat/pen/dvXmwX

        const add = state => ({ count: state.count + 1 })
    this.setState(add)
    this.setState(add)
    this.setState(add)

计数将按预期增加+3。

您可以在此处查看文档:https : //facebook.github.io/react/docs/react-
component.html#setstate



 类似资料:
  • 我知道这个问题以前有人问过,但请哼我一声。我很难掌握如何初始化一个类。 这是有问题的代码。 我感兴趣的错误是: 我做了建议的更改,现在我得到一个不同的错误:

  • 我只是想习惯基本的复制构造函数。 我假设我正确地放置了复制构造函数。 但是当我试图编译时,我不断地得到错误“没有匹配的构造函数来初始化B” 我有点困惑。

  • 问题内容: 我见过两个案例设置默认状态为: 与 使用第一个变体是不好的做法吗?我在哪里可以找到有关它的更多信息?还是该ecmascript的功能如何命名? 问题答案: 如果已配置babel,则可以使用第一个变体。它是类属性语法,不包含在ES7提议中,但可作为babel的第二阶段预设使用。然而,使用第一或第二变体是优先事项。它们都转换为完全相同的东西。 第一种方法: 第二种方法

  • 问题内容: 我有两个班,第一个是我的主班,第二个是我的编辑框架班。 我的第二个类(UpdateGUI)在其构造函数中提供oldName,并对其进行编辑,当我单击时,它将newName发送给我的第一个类。 我的第二堂课: 我的问题是,为什么newName为null? 更新: UpdateGUIDialog类: 输出: 我需要打印而不是null。 问题答案: Java对象有点像真实对象。并顾名思义:它

  • 主要内容:初始化 const 成员变量构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用 初始化列表。 C++构造函数的初始化列表使得代码更加简洁,请看下面的例子: 运行结果: 小明的年龄是15,成绩是92.5 李华的年龄是16,成绩是96 如本例所示,定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然也可以有其他语句),而是在函数首部与函数体之间添

  • 映射对构造函数没有限制或要求 (__init__ )类的方法。您可以自由地为您想要的函数要求任何参数,为ORM未知的实例分配属性,并且通常在编写Python类的构造函数时做您通常会做的任何其他事情。 sqlAlchemy ORM不调用 __init__ 从数据库行重新创建对象时。ORM的过程有点类似于Python标准库的 pickle 模块,调用低级 __new__ 方法,然后在实例上悄悄地恢复属