Отправка действий в редукте, если в инструкции редуктора в коммутаторе есть несколько случаев - PullRequest
0 голосов
/ 13 октября 2019

В actions я объявил действие export const CLEAR_ARRAY_TODOS = 'CLEAR_ARRAY_TODOS'; Я импортировал это действие в reducers. И я создал новый регистр case 'CLEAR_ARRAY_TODOS' in redurs` в операторе switch:

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

В компоненте todos я импортировал действие CLEAR_ARRAY_TODOS. И тут у меня проблема как в mapDispatchToProps в функции getTodos отправить это действие CLEAR_ARRAY_TODOS и подключить к кнопке Clear Array 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})
    });
};

Редукторы

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;

Todos

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

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Просто добавьте действие clearTodos в mapDispatchToProps

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

Тогда вы должны обрабатывать это действие только при нажатии кнопки, поэтому добавьте туда атрибут onClick:

<button onClick={this.props.clearTodos}>Clear array Todos</button>

1 голос
/ 13 октября 2019

CLEAR_ARRAY_TODOS не является действием, это просто переменная, содержащая строку типа действия. Вы должны добавить clearTodos действие

export const clearTodos = { type: CLEAR_ARRAY_TODOS }

или создателя действия

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...