使用React-Redux时从输入字段更新状态

时间:2019-07-23 03:08:21

标签: javascript reactjs redux react-redux

我目前正在使用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的方式更新每个状态。

有帮助吗?

2 个答案:

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