gpt4 book ai didi

javascript - 在redux中发送action,如果switch中的reducer指令有多种情况

转载 作者:行者123 更新时间:2023-12-01 00:32:49 25 4
gpt4 key购买 nike

actions中,我声明了操作export const CLEAR_ARRAY_TODOS = 'CLEAR_ARRAY_TODOS';我在 reducers 中导入了这个操作。我在 switch 语句中创建了一个新的 case case 'CLEAR_ARRAY_TODOS' in reducers` :

 case 'CLEAR_ARRAY_TODOS':
return {
todos: [],
};

todos组件中,我导入了操作CLEAR_ARRAY_TODOS。在这里,我遇到了一个问题,如函数 getTodos 中的 mapDispatchToProps 发送此操作 CLEAR_ARRAY_TODOS 并连接到按钮清除数组 Todos

此处演示:https://stackblitz.com/edit/react-iuvdna?file=reducers%2Findex.js

操作

import axios from 'axios';

export const GET_TODOS = 'GET_TODOS';
export const CLEAR_ARRAY_TODOS = 'CLEAR_ARRAY_TODOS';
export const FETCH_SUCCESS = 'FETCH_SUCCESS';
export const FETCH_FAILURE = 'FETCH_FAILURE';

export const getTodos = () =>
dispatch => {

return axios({
url: 'https://jsonplaceholder.typicode.com/todos',
method: 'GET',
})
.then(({data})=> {
console.log(data);

dispatch({type: GET_TODOS, payload:{
data
}});
})
.catch(error => {
console.log(error);

dispatch({type: FETCH_FAILURE})
});
};

export const getTodo = () =>
dispatch => {

return axios({
url: 'https://jsonplaceholder.typicode.com/todos',
method: 'GET',
})
.then(({data})=> {
console.log(data);

dispatch({type: GET_TODOS, payload:{
data
}});
})
.catch(error => {
console.log(error);

dispatch({type: FETCH_FAILURE})
});
};

reducer

import {GET_TODOS, CLEAR_ARRAY_TODOS} from '../../actions';

const initialState = {
todos: []
};

const rootReducer = (state = initialState, action) => {
switch (action.type) {
case 'GET_TODOS':
return {
...state,
todos: action.payload.data,
todo: action.payload.data[0]
};
case 'CLEAR_ARRAY_TODOS':
return {
todos: [],
};
default:
return state;
}
};

export default rootReducer;

待办事项

import React, { Component } from 'react';
import { connect } from 'react-redux';
import {getTodos, CLEAR_ARRAY_TODOS} from '../.././actions';

class Todos extends Component {
componentDidMount() {
this.props.getTodos();
}

render() {
return (
<div>
<button>Clear array Todos</button>
<ul>
{this.props.todos.map(todo => {
return <li key={todo.id}>
{todo.title}
</li>
})}
</ul>
</div>
);
}
}

const mapStateToProps = state => {
console.log(state.todos);
console.log(state.todo);
const { todos } = state;

return {
todos
};
};

const mapDispatchToProps = dispatch => ({
getTodos: () => dispatch(getTodos())
});

export default connect(mapStateToProps, mapDispatchToProps)(Todos);

最佳答案

CLEAR_ARRAY_TODOS 不是一个操作,只是一个保存操作类型字符串的变量。您应该添加一个 clearTodos 操作

export const clearTodos = { type: CLEAR_ARRAY_TODOS }

或 Action 创建者

export const clearTodos = () => ({ type: CLEAR_ARRAY_TODOS })

并在您的组件mapDispatchToProps中使用它(就像使用getTodos一样)

import React, { Component } from 'react';
import { connect } from 'react-redux';
import {getTodos, clearTodos} from '../.././actions';

class Todos extends Component {
componentDidMount() {
this.props.getTodos();
}

render() {
return (
<div>
<button onClick={ this.props.clearTodos }>Clear array Todos</button>
<ul>
{this.props.todos.map(todo => {
return <li key={todo.id}>
{todo.title}
</li>
})}
</ul>
</div>
);
}
}

const mapStateToProps = state => {
console.log(state.todos);
console.log(state.todo);
const { todos } = state;

return {
todos
};
};


const mapDispatchToProps = dispatch => ({
getTodos: () => dispatch(getTodos()),
clearTodos: () => dispatch(clearTodos())
});

export default connect(mapStateToProps, mapDispatchToProps)(Todos);

关于javascript - 在redux中发送action,如果switch中的reducer指令有多种情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58364292/

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