首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >setState与React.js中的replaceState

setState与React.js中的replaceState
EN

Stack Overflow用户
提问于 2014-04-25 20:48:07
回答 3查看 75.7K关注 0票数 99

我是React.js库的新手,在浏览一些教程时,我偶然发现:

  • this.setState
  • this.replaceState

给出的描述不是很清楚(IMO)。

代码语言:javascript
复制
setState is done to 'set' the state of a value, even if its already set 
in the 'getInitialState' function.

类似地,

代码语言:javascript
复制
The replaceState() method is for when you want to clear out the values 
already in state, and add new ones.

我尝试了this.setState({data: someArray});,然后是this.replaceState({test: someArray});,然后是console.logged,我发现state现在同时拥有datatest

然后,我尝试了this.setState({data: someArray});,然后是this.setState({test: someArray});,然后对它们进行了console.logged,我发现state同样同时具有datatest

那么,这两者到底有什么区别呢?

EN

回答 3

Stack Overflow用户

发布于 2015-04-24 16:05:13

示例定义:

代码语言:javascript
复制
// let's say that this.state is {foo: 42}

this.setState({bar: 117})

// this.state is now {foo: 42, bar: 117}

this.setState({foo: 43})

// this.state is now {foo: 43, bar: 117}

this.replaceState({baz: "hello"})

// this.state. is now {baz: "hello"}

不过,请注意docs中的这一点:

setState()不会立即改变this.state,但会创建一个挂起的状态转换。在调用此方法后访问this.state可能会返回现有值。

replaceState()也是如此

票数 47
EN

Stack Overflow用户

发布于 2016-03-14 22:02:34

根据docs的说法,replaceState可能会被弃用:

此方法在扩展React.Component的ES6类组件上不可用。它可能会在React的未来版本中被完全删除。

票数 14
EN

Stack Overflow用户

发布于 2020-02-07 04:56:05

由于replaceState现在已弃用,因此这里有一个非常简单的解决方法。尽管你可能很少会/应该求助于此。

要删除状态,请执行以下操作:

代码语言:javascript
复制
for (const old_key of Object.keys(this.state))
    this.setState({ [old_key]: undefined });

或者,如果您不想多次调用setState

代码语言:javascript
复制
const new_state = {};
for (const old_key of Object.keys(this.state))
    new_state[old_key] = undefined;
this.setState(new_state);

实际上,状态中以前的所有键现在都返回undefined,可以很容易地使用if语句对其进行过滤:

代码语言:javascript
复制
if (this.state.some_old_key) {
    // work with key
} else {
    // key is undefined (has been removed)
}

if ( ! this.state.some_old_key) {
    // key is undefined (has been removed)
} else {
    // work with key
}

在JSX中:

代码语言:javascript
复制
render() {
    return <div>
        { this.state.some_old_key ? "The state remains" : "The state is gone" }
    </div>
}

最后,要“替换”状态,只需将新的状态对象与已被undefined的旧状态的副本组合在一起,并将其设置为状态:

代码语言:javascript
复制
const new_state = {new_key1: "value1", new_key2: "value2"};
const state = this.state;

for (const old_key of Object.keys(state))
    state[old_key] = undefined;

for (const new_key of Object.keys(new_state))
    state[new_key] = new_state[new_key];

this.setState(state);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23293626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档