我目前正在使用React-Redux,但用于一个非常简单的应用程序。 该应用程序只需要获取用户ID,密码和用户想要进入的服务器地址。它进入服务器并在服务器中运行脚本。但是在我的问题中,该应用程序的功能并不重要。
我只需要3个状态(用户名,密码和server_address)即可。
但是,我有三种不同的化简器和动作,它们只是在不同的状态下完成相同的事情。
例如,
userReducer.js
// reducer函数具有默认状态和要应用的动作
import { UPDATE_USER } from '../actions/userActions'
export default function userReducer(state = '', { type, payload }) {
switch (type) {
case UPDATE_USER:
return payload;
default:
return state;
}
}
passwordReducer.js
// reducer functions takes a default state and an action to apply
import { UPDATE_PASSWORD } from '../actions/passwordActions'
export default function passwordReducer(state = '', { type, payload }) {
switch (type) {
case UPDATE_PASSWORD:
return payload;
default:
return state;
}
}
routerReducer.js //这是服务器
// reducer函数具有默认状态和要应用的动作
import { UPDATE_ROUTER } from '../actions/routerActions'
export default function routerReducer(state = '', { type, payload }) {
switch (type) {
case UPDATE_ROUTER:
return payload;
default:
return state;
}
}
和如下所示的动作:
export const UPDATE_PASSWORD = 'updatePassword'
export function updatePassword(newPassword) {
return {
type: UPDATE_PASSWORD,
payload: {
'newPassword': newPassword
}
}
}
其他两个变量相同。
然后在我的组件中,我刚刚将mapActionsToProps
连接到该组件,并放置了3个功能相同的函数(更新状态)
class Container extends React.Component {
constructor(props) {
super(props)
}
onUpdateUser = (e) => {
this.props.onUpdateUser(e.target.value)
}
onUpdatePassword = (e) => {
this.props.onUpdatePassword(e.target.value)
}
onUpdateRouter = (e) => {
this.props.onUpdateRouter(e.target.value)
}
...
像
这有点用,但是我不确定这是否是使用React-Redux的正确方法。首先,它们是重复项,似乎不是一个好习惯。但是,我想不出一种方法,而不仅仅是放下相似的代码,从而以React-Redux的方式更新每个状态。
有帮助吗?
答案 0 :(得分:1)
您可以将事件传递给您的 action.js
export const onInputChange = event => ({
type: 'UPDATE_INPUT',
payload: event
});
只需在 reducer.js
中获取事件的名称和值const INITIAL_STATE = {
user: '',
password: ''
}
export const inputReducer = (state = INITIAL_STATE, action) => {
switch (action.type) {
case: 'UPDATE_INPUT':
return { ...state, [action.payload.target.name]: action.payload.target.value };
default:
return state;
};
};
然后在您的组件中
// ...
handleChange(event) {
this.props.onInputChange(event);
};
// ...
<input type='text' name='user' onChange={this.handleChange} />
答案 1 :(得分:0)
您可以仅使用一个功能来发送要更新的键/值对。
export const UPDATE_USER_VALUE = 'updateUserValues'
export function updateUser(payload) {
return {
type: UPDATE_USER_VALUE,
payload: payload,
}
}
您必须像这样调用该函数:
onUpdateUser = (e) => {
this.props.onUpdateUser({
key: 'name',
value: e.target.value
})
}
onUpdatePassword = (e) => {
this.props.onUpdateUser({
key: 'password',
value: e.target.value
})
}
然后只更新值。
import { UPDATE_USER_VALUE } from '../actions/userActions'
const defaultState = {
username = '',
password = '',
server_address = ''
};
export default function passwordReducer(state = defaultState, { type, payload }) {
switch (type) {
case UPDATE_USER_VALUE:
return {
...state,
state[payload.key]: payload.value
};
default:
return state;
}
}