ant*_*rea 5 javascript reactjs redux
我仍然是一个反应/减少菜鸟.在一个页面上,我有大量的文本输入.过了一会儿,我开始注意到我的动作文件有功能做同样的事情,但对于不同的输入:
export function setInputName(string) {
return {
type: 'SET_CURRENT_NAME',
payload: {value: string}
};
}
export function setInputCity(string) {
return {
type: 'SET_CURRENT_CITY',
payload: {value: string}
};
}
Run Code Online (Sandbox Code Playgroud)
我的减速机看起来像:
export function currentName(state='', {type, payload}) {
switch (type) {
case 'SET_CURRENT_NAME':
return payload.value;
default:
return state;
}
}
export function currentCity(state='', {type, payload}) {
switch (type) {
case 'SET_CURRENT_CITY':
return payload.value;
default:
return state;
}
}
Run Code Online (Sandbox Code Playgroud)
我的组件有这些多个输入:
import {Component, PropTypes} from 'react';
import {connect} from 'react-redux';
import {bindActionCreators} from 'redux';
import {setInputName, setInputCity} from 'actions/form';
export default class Form extends Component {
static propTypes = {
setInputName: PropTypes.func.isRequired,
setInputCity: PropTypes.func.isRequired,
currentName: PropTypes.string.isRequired,
currentCity: PropTypes.string.isRequired
}
render() {
let {setInputName, setInputCity, currentName, currentCity} = this.props;
return (
<div>
<input
type="text"
placeholder="Name"
onChange={(e) => setInputName(e.currentTarget.value)}
value={currentName}
/>
<input
type="text"
placeholder="City"
onChange={(e) => setInputCity(e.currentTarget.value)}
value={currentCity}
/>
</div>
);
}
}
function select(state) {
return {
currentName: state.form.currentName,
currentCity: state.form.currentCity
};
}
function actions(dispatch) {
return bindActionCreators({
setInputName: setInputName,
setInputCity: setInputCity,
}, dispatch);
}
export default connect(select, actions)(Form);
Run Code Online (Sandbox Code Playgroud)
哪个不是很干,我立刻以为我做错了什么.有没有一种方法可以setInputValue对我的应用程序的每个页面和组件上的所有文本输入进行共同操作?我还想为每个输入使用一个通用的减速器.谢谢.
UPDATE
这是我的重要例子,但我觉得这仍然有点复杂,必须有一个更好的方法.基本上在reducer中我检查是否已使用该输入并将其添加到状态.如果不是我添加它.如果是这样,我只是更新它的价值.编辑我撒谎这实际上不起作用.
// actions
export function updateTextInput(name, value) {
return {
type: 'SET_CURRENT_TEXT_INPUT',
payload: {name: name, value: value}
};
}
// reducer
export function currentTextInput(state=[], {type, payload}) {
switch (type) {
case 'SET_CURRENT_TEXT_INPUT':
let newState = state;
let curInput = state.findIndex(function(elem) {
return elem.name === payload.name;
});
if (curInput === -1) {
newState.push({name: payload.name, value: payload.value});
} else {
newState[curInput].value = payload.value;
}
return newState;
default:
return state;
}
}
// component
...
render() {
let {updateTextInput, currentTextInput} = this.props;
return (
<div>
<input
type="text"
placeholder="Name"
onChange={(e) => updateTextInput('name', e.currentTarget.value)}
value={currentTextInput.name}
/>
<input
type="text"
placeholder="City"
onChange={(e) => updateTextInput('city', e.currentTarget.value)}
value={currentTextInput.city}
/>
</div>
);
}
...
Run Code Online (Sandbox Code Playgroud)
简化代码的第一步是使用更高阶的减少器/函数.
function makePropReducer(actionType, prop) {
return (state = '', {type, payload}) => {
if (type === actionType) {
return payload[prop];
}
return state;
};
}
export const currentName = makePropReducer('SET_CURRENT_NAME', 'value');
export const currentCity = makePropReducer('SET_CURRENT_CITY', 'value');
Run Code Online (Sandbox Code Playgroud)
好的,这是一个要求的例子.假设我有一个用户数据模型,它看起来像这样:
{
id: 1,
name: 'Some Name',
email: 'someemail@some.com',
age: 21
}
Run Code Online (Sandbox Code Playgroud)
他们当前设置的方式是您必须拥有SET_USER_NAME,SET_USER_EMAIL,SET_USER_AGE操作.当您可以使用UPDATE_USER操作接收更新值的对象作为参数时,不需要所有这些操作.
要为第一个用户设置新名称,您可以调用UPDATE_USER操作
updateUser(1, { name: 'New Name' })
在Users reducer中,您将更新用户状态(用户数组)
function updateUser(usersState, id, attrs) {
return usersState.map(user =>
user.id === id ?
Object.assign({}, user, attrs) :
user
);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4295 次 |
| 最近记录: |