【问题标题】:Updating states from input field when using React-Redux使用 React-Redux 时从输入字段更新状态
【发布时间】:2019-07-23 03:08:21
【问题描述】:

我目前正在使用 React-Redux,但它是一个非常简单的应用程序。 该应用程序只是简单地获取用户 ID、密码和用户想要进入的服务器地址。它进入服务器并在服务器中运行脚本。但在我的问题中,应用程序的功能并不重要。

我只需要应用程序的 3 个状态(用户名、密码和服务器地址)。

但是,我有三个不同的 reducer 和 action,它们在不同的状态下做同样的事情。

例如,

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 的方式更新每个状态,而不只是放置类似的代码。

有什么帮助吗?

【问题讨论】:

  • 不是直接在Reducer中返回payload对象,而是在Reducer中创建状态,存储并返回payload对象。

标签: javascript reactjs redux react-redux


【解决方案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} />

【讨论】:

    【解决方案2】:

    您可以使用单个函数来发送要更新的键/值对。

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

    【讨论】:

      猜你喜欢
      • 2016-04-01
      • 1970-01-01
      • 2016-07-14
      • 2017-09-15
      • 2021-11-02
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 2020-04-14
      相关资源
      最近更新 更多