【问题标题】:Save local state in React在 React 中保存本地状态
【发布时间】:2017-07-19 12:22:17
【问题描述】:

在我的应用程序中,我使用了几个 Container 组件。在每个Container中,都有Buttons

根据应用程序的stateButtons 可点击(或不可点击)。 Button 是否被禁用,在每个 Container 的本地state 中进行管理。 可以保存和加载应用程序的结果和状态。

问题来了: 当我保存(或加载)应用程序时,很难从 每个 Container 中“提取Buttonsstate。在全局 state (Redux) 中保存是相当容易的。

但是如何从每个 Container 保存本地state,如何将其反馈给每个Container

读取本地state 是通过父Component 管理的,它从子Component 调用方法。我知道这是一种反模式,但它确实有效。

export class SomeConmponent {
....

    onClickSaveProjecthandler(event) {
        const localStateProjectSettings = this.childProjectSettings.getLocalState();
        const localStateLayerFilter = this.childLayerFilter.getLocalState();

        return {
          "ProjectSettings": localStateProjectSettings,
          "Filter": localFilter
        };
      }


    render() {
        return(
            <ProjectSettingsContainer onRef={ref => (this.childProjectSettings = ref)}/>
        )
    }
}

有更好的建议吗?

【问题讨论】:

  • 你已经提到了redux;为什么不使用它而不是本地状态?
  • »我知道这是一种反模式,但它确实有效。« 显然没有,看看您是如何面对这个问题的。
  • @IngoBürk 我不想使用redux,因为是否将按钮变灰是应该component/container 中完成的事情。无需重新渲染整个站点,只需将按钮变灰(当我使用 redux 时会发生这种情况!)

标签: javascript reactjs redux state


【解决方案1】:

正如您已经提到的,使用 redux 来获得单一事实是一个好主意。并且要将状态“反馈”回容器,您必须将状态和道具映射到您的组件。

这是一个来自官方文档的容器示例:

import { connect } from 'react-redux'
import { setVisibilityFilter } from '../actions'
import Link from '../components/Link'

const mapStateToProps = (state, ownProps) => {
  return {
    active: ownProps.filter === state.visibilityFilter
  }
}

const mapDispatchToProps = (dispatch, ownProps) => {
  return {
    onClick: () => {
      dispatch(setVisibilityFilter(ownProps.filter))
    }
  }
}

const FilterLink = connect(
  mapStateToProps,
  mapDispatchToProps
)(Link)

export default FilterLink

连接完成了所有的魔法。

【讨论】:

  • 我不想使用redux,因为是否将按钮变灰是应该component/container 中完成的。无需重新渲染整个网站,只需将按钮变灰(当我使用 redux 时会发生这种情况!)
【解决方案2】:

听起来你可以使用 Redux,但不知何故,你误解了它的架构只是 global 状态的同义词。制作 Redux 的原因之一是解决保存多个独立组件的状态的问题。

但是,这里有一个完全不同的答案:为什么不使用全局状态序列化器并将每个组件连接到它?如果您不喜欢引用全局变量的想法,更好的选择是创建某种与 React 一起使用的依赖注入 (DI) 框架。不久前我创建了一个名为AntidoteJS 的库,它就是这样做的。您不需要使用它,但它会向您展示如何完成它。看看the source吧。

这里有一些又快又脏的东西。我没有测试过,但它显示了基本思想:

import { inject } from "antidotejs"

export class MyComponent extends React.Component {

  @inject("StateSerializer")
  serializer

  constuctor(props, children) {
    super(props, children);
    this.serializer.load(props.id);
  }

  setState(newState) {
    super.setState(newState);
    this.serializer.save(newState);
  }

}

【讨论】:

  • 我不想使用redux,因为是否将按钮变灰是应该component/container 中完成的事情。无需重新渲染整个网站,只需将按钮变灰(当我使用 redux 时会发生这种情况!)
猜你喜欢
  • 2018-07-14
  • 2020-08-05
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多