【问题标题】:Is setState() optional for updating the state in Alt.js store?setState() 是否可用于更新 Alt.js 商店中的状态?
【发布时间】:2017-04-22 13:36:58
【问题描述】:

是的,我知道 setState() 会更新 Store 的状态并向所有订阅者发出更改事件,但我发现并不是每个人都使用它并在更新状态时忽略它。

例如在下面的alt-todo repo,他们不使用setState()

class TodoStore {
    constructor() {
        this.bindActions(TodoActions);

        this.todos = {};
    }

    onCreate(text) {
        text = text.trim()
        if (text === '') {
            return false
        }
        // hand waving of course.
        const id = (+new Date() + Math.floor(Math.random() * 999999)).toString(36)
        this.todos[id] = {
            id: id,
            complete: false,
            text: text
        }
    }
}

但是在official alt.js repo 他们使用它:

class LocationStore {
    constructor() {
        this.bindAction(locationActions.updateLocation, this.onUpdateLocation);

      this.state = {
        city: 'Denver',
        country: 'US'
      };
    }

    onUpdateLocation(obj) {
        const { city, country } = obj
        this.setState({ city, country });
    }
}

所以我想知道这两种方式有什么区别?

【问题讨论】:

    标签: javascript reactjs reactjs-flux alt.js


    【解决方案1】:

    真的没有:

    setState 在 Alt 内部用于设置状态。您可以覆盖它以提供您自己的 setState 实现。在内部,setState 是 Object.assign 的别名。 setState 必须返回一个对象。

    http://alt.js.org/docs/createStore/#setstate

    一个例子: 假设您的状态是:

    {
      city: 'Denver',
      country: 'US',
    }
    

    更新状态的两种方式:

    this.setState({city: 'Colorado Springs'})
    console.log(this.state) // {city: 'Colorado Springs', country: 'US' })
    
    this.state = { city: 'Elbert' }
    console.log(this.state) // state is {city: 'Elbert'}
    

    如您所见,this.state = 覆盖状态,而this.setState() 将新状态合并到旧状态。见Object.assign()

    【讨论】:

    • 那么如果this.setState()被省略了,那么默认会调用,对吧?
    • 没有。你只会覆盖你的整个状态而不是合并它。
    • 我还注意到直接分配状态并不总是触发emitChange()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2020-02-23
    • 2019-01-25
    • 2016-08-07
    • 1970-01-01
    相关资源
    最近更新 更多