как решить эту проблему с рендером в Redux? - PullRequest
0 голосов
/ 27 февраля 2020

Я перенес свой проект из просто React в стек React, Redux и response-redux, и произошла ошибка. До переноса в этот стек все работало адекватно. введите описание изображения здесь . Я пытался исправить это за 3 дня, но это не сработало.

Мой индекс. js:

import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import store from "./store/date";
import {BrowserRouter} from "react-router-dom";
import {Provider} from "react-redux";
import App from "./App";
const rerender=()=> {
    ReactDOM.render(
        <BrowserRouter>
            <Provider store={store}>
            <App /></Provider></BrowserRouter>, document.getElementById("root")
    );
};
rerender();
store.subscribe(()=>{
    rerender()
})

Мой файл с датой (date. js) :

import {combineReducers, createStore} from "redux";
import realtorsDate from "./realtorsDate";
let isMenuVisible = true;
const UpdateMenu = (state = isMenuVisible, action) => {
    switch (action.type) {
        case 'UpdateMenu' :
            let copystate = !state;
            return copystate;
        default :
            return state;
     }
};
let menuDate=[
    {
        Name: "Main",
        Symbol: "/",
        Src: ""
    },
    {
        Name: "logo",
        Symbol: "img",
        Src: "./../Images/logo.png"
    },
    {
        Name: "About us",
        Symbol: "#",
        Src: "about"
    },
    {
        Name: "Our team",
        Symbol: "#",
        Src: "team"
    },
    {
        Name: "Vacancies",
        Symbol: "/",
        Src: "work"
    },
    {
        Name: "Advantage",
        Symbol: "#",
        Src: "adv"
    },
    {
        Name: "Contacts",
        Symbol: "#",
        Src: "cont"
    }
]
let reducers=combineReducers({UpdateMenu,realtorsDate})
const store=createStore (UpdateMenu,menuDate);
export default store;

Компонент контейнера:

import {connect} from "react-redux";
import MobileMenu from "./menu";
let menuStateText= {
    type: "UpdateMenu"
}
let MapStateToProps=(state)=>{
    return {
        menuDate: state.menuDate}}
let MapDispatchToProps=(dispatch)=>{
    return {
        UpdateMenu: ()=> {
            dispatch (menuStateText)
        }
    }
}
let MobileMenuContainer=connect(MapDispatchToProps,MapStateToProps)(MobileMenu);
export default MobileMenuContainer

Компонент:

import React from "react"
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
import {faBars} from "@fortawesome/free-solid-svg-icons/faBars";
import "./../css/App.css"
import ParagraphOfMenu from "./paragraphMenu";
class MobileMenu extends React.Component {
    render(props) {
        debugger
        let Menu =()=>{this.props.menuDate.map((el,i) => (
            <ParagraphOfMenu el={el} key={i}/>
        ))}
        return (
            <div className="mobileMenuBlock">
                <FontAwesomeIcon icon={faBars} onClick="return false"></FontAwesomeIcon>
                <header className={(this.props.UpdateMenu) ?"hidemenu":"mobilemenu"}>
                    <nav>
                        <ul className="">
                            <Menu></Menu>
                        </ul>
                    </nav>
                </header>
            </div>
        );
    }
}
export default MobileMenu

ссылка на код: codesandbox

заранее спасибо

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

let MobileMenuContainer = connect(
  MapStateToProps,
  MapDispatchToProps
)(MobileMenu);

Вот ваша проблема, вам нужно передать MapStateToProps вместо MapDispatchToProps

1 голос
/ 27 февраля 2020

В этом коде я нашел несколько проблем, поэтому я укажу их вам и надеюсь, что они могут вам помочь.

Прежде всего, взгляните на это:

const store = createStore(UpdateMenu, menuDate);

Для этого нужно создать новое хранилище и инициализировать его значением, которое вы передали в качестве аргумента . Поскольку вы передали один редуктор функции createStore, значение, присвоенное state, будет массивом, который вы имели в переменной menuDate.

Прямо сейчас вы не можете получить доступ к state.menuDate, потому что state это не объект : он содержит сам массив. Если вы хотите получить этот массив, вам придется обновить метод MapStateToProps следующим образом:

let MapStateToProps = (state) => {
    return { menuDate: state }
}

Я также заметил, что вы используете combineReducers, но в итоге вы не используя комбинированный редуктор для чего угодно.

let reducers = combineReducers({
  UpdateMenu,
  realtorsDate
});

Если вы хотите использовать оба, вы должны обновить вызов до createStore, передав ему комбинированные редукторы, а не UpdateMenu.

createStore(reducers)

Если вы решите использовать при этом имейте в виду, что созданное вами хранилище будет иметь следующую структуру:

{
  UpdateMenu: [value returned by the UpdateMenu reducer],
  realtorsDate: [value returned by the realtorsDate reducer]
}

Если вы хотите применить другую структуру для вашего хранилища, вы должны изменить передаваемый объект на combineReducer. Вот пример:

combineReducers({
  post: postReducer,
  topic: topicReducer
})

Вы также должны взглянуть на то, как вы звоните connect:

let MobileMenuContainer=connect(MapDispatchToProps,MapStateToProps)(MobileMenu);

Вы передаете два аргумента в обратный порядок . Как вы можете видеть в официальных react-redux документах , MapStateToProps должен быть первым параметром, а MapDispatchToProps - вторым.

Последняя, ​​и не в последнюю очередь, проблема, которую я обнаружил, заключается в реализации самого редуктора UpdateMenu.

const UpdateMenu = (state = isMenuVisible, action) => {
    switch (action.type) {
        case 'UpdateMenu' :
            let copystate = !state;
            return copystate;
        default :
            return state;
     }
};

Я не совсем уверен, что означают ваши действия делать, но прямо сейчас ваше состояние содержит массив элементов . Когда действие UpdateMenu запускает , однако, этот массив заменяется значением false . Это означает, что вы теряете все свои данные, поэтому вам, вероятно, следует проверить это.

Если вы не предотвратите это, вы столкнетесь с новой ошибкой при вызове map, потому что ваше состояние больше не содержит массив после отправки действия UpdateMenu. Редуктор должен вернуть новый массив с обновленными данными, чтобы все работало как положено.

0 голосов
/ 27 февраля 2020

В коде было много ошибок:

  1. connect принимает первый аргумент как MapStateToProps, а второй как MapDispatchToProps, вы передаете его в неправильном порядке.
  2. Ваша переменная let Menu определена как функция, она должна быть Компонентом.
  3. Метод Update определен в методе рендеринга, его следует вместо этого определить как метод класса. Поскольку вы уже и вызываете метод, который вы получаете в реквизит там.

Вы можете сослаться на этот рабочий код: https://codesandbox.io/s/eager-bose-5lejz?fontsize=14&hidenavigation=1&theme=dark

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...