gpt4 book ai didi

javascript - 与 react/redux 共享 actions 和 reducers

转载 作者:数据小太阳 更新时间:2023-10-29 05:49:38 25 4
gpt4 key购买 nike

我仍然是一个 react/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}
};
}

我的 reducer 看起来像:

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;
}
}

我的组件有这些多个输入:

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);

这不是很干,我立即认为我做错了什么。有没有一种好方法可以让我的应用程序的每个页面和组件上的所有文本输入都有一个通用的 setInputValue 操作?我还想为每个输入使用一个通用的 reducer 。谢谢。

更新

这是我的粗略示例,但我觉得这仍然有点令人费解,必须有更好的方法。基本上在 reducer 中,我检查该输入是否已被使用并添加到状态中。如果没有我添加它。如果是这样,我只是更新它的值(value)。 编辑 我撒谎说这实际上不起作用。

// 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>
);
}
...

最佳答案

简化代码的第一步是使用高阶 reducer/函数。

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');

关于javascript - 与 react/redux 共享 actions 和 reducers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33701400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com