从 Redux 状态中的数组中获取活动项
Get active item from an array inside the Redux state
我想用 React/Redux 应用创建草稿系统。
我的草稿存储在一个由 Redux 简化的数组中。我在 React 组件中渲染我的草稿。当我点击一个项目时,点击的项目应该被标记为活动并且草稿被加载。
问题是,我不知道如何以方便的方式从 Redux 状态获取当前活动数组项。
到目前为止我做了什么(缩小,没有容器等):
import React from 'react';
import { createStore } from 'redux';
const drafts = (state = [{ title: '' }], action) => {
switch (action.type) {
case 'CREATE_NEW_DRAFT':
return [{ title: '' }, ...state];
case 'ACTIVATE_DRAFT':
// This is where I need help
case 'UPDATE_ACTIVE_DRAFT':
// This is where I need help
default:
return state;
}
});
const store = createStore(drafts);
const drafts = store.getState().drafts;
const draft = drafts[0]; // Maybe something like this? Looks ugly to me
const createDraft = () => store.dispatch({
type: 'CREATE_NEW_DRAFT',
});
const activateDraft = draft => (e) => {
e.preventDefault();
store.dispatch({
draft,
type: 'ACTIVATE_DRAFT',
});
};
const updateDraft = e => store.dispatch({
title: e.target.value,
type: 'UPDATE_ACTIVE_DRAFT',
});
export default () => (
<div>
<ul>
{drafts.map((element, i) => (
<li key={i}>
<a onClick={activateDraft(element)}>element.title</a>
</li>
))}
</ul>
<button type="button" onClick={createDraft}>Create</button>
<input type="text" value={draft.title} onChange={updateDraft} />
</div>
);
那么,我怎么知道哪个项目是活跃的?我如何 "activate" 一个项目?一种解决方案是状态中的 "active" 指针,但处理起来感觉不是很舒服。
谢谢!
我终于找到了这个问题的答案。我将 activeDraft 指针存储在附加状态 属性 中,以便我可以通过 state.drafts[state.active]
.
获取 activeDraft
我用我的减速器中的这个案例更新了活动草稿:
case 'UPDATE_DRAFT':
return [
...state.slice(0, action.active),
Object.assign({}, state[action.active], action.draft),
...state.slice(action.active + 1),
];
action.active
是我传递给组件的新状态 属性:
<input type="text" onChange={updateDraft(state.active)} />
激活草稿的方式相同。
我想用 React/Redux 应用创建草稿系统。
我的草稿存储在一个由 Redux 简化的数组中。我在 React 组件中渲染我的草稿。当我点击一个项目时,点击的项目应该被标记为活动并且草稿被加载。
问题是,我不知道如何以方便的方式从 Redux 状态获取当前活动数组项。
到目前为止我做了什么(缩小,没有容器等):
import React from 'react';
import { createStore } from 'redux';
const drafts = (state = [{ title: '' }], action) => {
switch (action.type) {
case 'CREATE_NEW_DRAFT':
return [{ title: '' }, ...state];
case 'ACTIVATE_DRAFT':
// This is where I need help
case 'UPDATE_ACTIVE_DRAFT':
// This is where I need help
default:
return state;
}
});
const store = createStore(drafts);
const drafts = store.getState().drafts;
const draft = drafts[0]; // Maybe something like this? Looks ugly to me
const createDraft = () => store.dispatch({
type: 'CREATE_NEW_DRAFT',
});
const activateDraft = draft => (e) => {
e.preventDefault();
store.dispatch({
draft,
type: 'ACTIVATE_DRAFT',
});
};
const updateDraft = e => store.dispatch({
title: e.target.value,
type: 'UPDATE_ACTIVE_DRAFT',
});
export default () => (
<div>
<ul>
{drafts.map((element, i) => (
<li key={i}>
<a onClick={activateDraft(element)}>element.title</a>
</li>
))}
</ul>
<button type="button" onClick={createDraft}>Create</button>
<input type="text" value={draft.title} onChange={updateDraft} />
</div>
);
那么,我怎么知道哪个项目是活跃的?我如何 "activate" 一个项目?一种解决方案是状态中的 "active" 指针,但处理起来感觉不是很舒服。
谢谢!
我终于找到了这个问题的答案。我将 activeDraft 指针存储在附加状态 属性 中,以便我可以通过 state.drafts[state.active]
.
我用我的减速器中的这个案例更新了活动草稿:
case 'UPDATE_DRAFT':
return [
...state.slice(0, action.active),
Object.assign({}, state[action.active], action.draft),
...state.slice(action.active + 1),
];
action.active
是我传递给组件的新状态 属性:
<input type="text" onChange={updateDraft(state.active)} />
激活草稿的方式相同。