我如何 display/hide 一个依赖于 Redux 商店上的 属性 的组件?

How can I display/hide a component depending on a property on the Redux store?

我正在学习 Redux,但我无法正确理解它。 现在我正在用它构建一个个人项目来学习它。

我在导航栏上有这个 "Settings button"(实际上,它是一个列表项)。单击它时,我希望另一个组件显示出来。这将是 <Settings /> 组件。该组件有一个 "Close button" 要隐藏。

我的想法是在 redux global store 上有一个 属性 像这样:settingsOpen: false 当我点击按钮时它变为 true 并且组件出现,反之亦然。关闭按钮始终将 属性 设置为 false 并关闭组件。

在这里你可以找到所有的代码:https://github.com/lbluigi/react-ecommerce

无论如何,我认为重要的部分是:

Header.js分量

这是将切换“设置”组件的单击列表项。

<a onClick={(event) => this.props.toggleSettings(event)} href="#settings" className="nav-link"><i className="fa fa-cog" aria-hidden="true"></i> Settings</a>

Settings.js分量

这是根据 settingsOpens 属性 必须出现和消失的组件。

<div className={this.props.settings.settingsOpen ? 'settings' : 'hidden'}>
  <i className="fa fa-times fa-3x" aria-hidden="true"></i>
  {/* just a test <h2>{this.props.settings.themeColor}</h2> */}
</div>

切换Settings.js 操作 这是我之前写的设置按钮点击事件触发的函数

event.preventDefault();
return {
  type: 'SETTINGS_TOGGLED'
}

settingsReducer.js减速器

这是设置初始属性的缩减器,用户可以通过与“设置”组件进行交互来更改这些属性。

{
  settingsOpen: false,
  themeColor: 'light',
  gridView: 'grid'
}

我可以写更多,但您会在我之前链接的 GitHub 存储库中找到所有内容。我不知道如何在单击时继续更改 属性 settingsOpen

你的 settingsReducer 必须是一个函数,它 returns 一个通过调度动作的对象(状态)。在你的情况下应该是:

const defaultSettings = {settingsOpen: false, themeColor: 'light'}
const settingsReducer = (state = defaultSettings, action) {
  if (action.type === 'SETTINGS_TOGGLED') {
    return {
      ...state,
      settingsOpen: !state.settingsOpen
    }
  }
  return state
}

我创建了一个小例子: https://codesandbox.io/s/wq24zkkrvw

基本上我用 isOpen=false 初始化了商店 每次单击按钮时都会切换此值。

减速器:

const initState = {
  isOpen: false
};
export default (state = initState, action) => {
  switch (action.type) {
    case 'TOGGLE':
      return { isOpen: !state.isOpen };
    default:
      return state;
  }
};

这是将分派操作的组件:

<Counter
      isOpen={store.getState().isOpen}
      onToggle={() => store.dispatch({ type: 'TOGGLE' })}
    />

如果你想随着时间的推移改变一些商店 属性 - 你需要一个减速器。因为 reducer 是负责存储突变(更改)的功能。你已经有了一个,但它总是 return 相同的值。

function settingsReducer() {
  return {
    settingsOpen: false,
    color: 'light',
    view: 'grid'
  }
}

首先你必须修改它以添加反应 - once action appear, i would want to modify store like this:,

function settingsReducer(state, action) {
    if (action.type === 'SETTINGS_TOGGLED') {
      return {
        settingsOpen: !state.settingsOpen,
        color: 'light',
        view: 'grid',
      };
    }
    return {
      settingsOpen: false,
      color: 'light',
      view: 'grid',
    };
  }

那时你必须创建(定义)一个 action.

之后继续在您的页眉中添加 link 并添加 dispatch of an action instead returning value. Note that you have to connect header 组件以进行调度。现在你的 action 将出现在 reducer 中并且能够修改 store 您可以使用某种 logger 来检查您的系统中发生了什么 确保状态按计划更改后 - 您需要 connect 一个 Settings 组件到商店以将 settingsOpen 属性 从商店传递到组件。

这就是您再次 return 设置组件的地方,但来自不同的方面。在 redux 中思考总是这样——你必须计划和实施整个循环。类似于:component handles click -> action -> reducer -> store changes -> component -> render changes