Как исправить эту ошибку «combReducers» только для чтения.в реакционно-нативной / реактивно-избыточной - PullRequest
0 голосов
/ 30 апреля 2019

Я создаю новое приложение todo на реагирующем языке с использованием приставки. При настройке rootReducer с использованием combReducers я получаю следующую ошибку.

«combReducers» доступно только для чтения.

// reducers/todos.js

let nextId = 0;
const todos = (state = [], action) => {
    switch (action.type) {

        case 'ADD_TODO':

            return [
                ...state, {
                    id: nextId++,
                    text: action.text,
                    completed: false,
                }
            ]

        case 'TOGGLE_TODO':
            return state.map(todo =>
                (todo.id === action.id) ? { ...todos, completed: !todo.completed } : todo)

        default:
            return state
    }
}
export default todos;

создал фильтр видимости для переключения состояния todo.


// reducers/visibilityFilter.js

const visibilityFilter = (state='SHOW_ALL', action) =>{
    return state;
}

export default visibilityFilter;

объединение обоих редукторов в индексный файл.

// reducers/index.js 

import { combineReducers } from 'redux';

import todos from './todos';
import visibilityFilter from './visibilityFilter';

export default combineReducers = combineReducers({
    todos,
    visibilityFilter
})

Вот файл моего магазина

import { createStore } from 'redux';

import rootReducer from '../reducers';

export default store = createStore(rootReducer);

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Как четко указано в сообщении, вам не разрешено переназначать combineReducers. Просто измените свой код на следующий, как описано в документах :

export default rootReducer = combineReducers({
    todos,
    visibilityFilter
})
0 голосов
/ 08 мая 2019

Почему у вас это так?

export default combineReducers = combineReducers({
    todos,
    visibilityFilter
})

combineReducers() написаны таким образом:

import { combineReducers } from "redux";

export default combineReducers({
  todos: () => {
    return {};
  }
});

Дайте этому попытку и помните, что редуктор всегда должен возвращатьобъект, строка или число, это минимальное требование для начала работы с редукторами, чтобы гарантировать, что ваше приложение не сломается и вы можете вывести некоторый контент на экран.

Кроме того, вы неОбязательно нужно идентифицировать ваш combineReducers() как rootReducer, вы можете просто сложить его так:

import { createStore, compose, applyMiddleware } from "redux";
import thunk from "redux-thunk";
import reducers from "../reducers";

const store = createStore(reducers, {}, compose(applyMiddleware(thunk)));

export default store;

Наконец, когда вы создали store, вам необходимо импортировать его обратно вваш App.js и подключите его с тегом Provider, например, так:

import React from "react";
import { StyleSheet, Text, View } from "react-native";
import {
  createBottomTabNavigator,
  createStackNavigator,
  createAppContainer
} from "react-navigation";
import { Provider } from "react-redux";

import store from "./store";

И:

export default class App extends React.Component {
  render() {
    return (
      <Provider store={store}>
        <View style={styles.container}>
          <MainNavigator />
        </View>
      </Provider>
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...