redux StateToProps действует странно. this.props не определено, но не всегда

#javascript #reactjs #redux #undefined

#javascript #reactjs #redux #не определено

Вопрос:

У меня есть кнопка, которая редактирует некоторые вещи на странице, я хочу изменить текст внутри кнопки в соответствии с ролью пользователя. кнопка имеет функцию onClick, внутри этой функции определяется «this.props.login.role» и работает должным образом. но когда я помещаю «this.props.login.role» между тегами, он не определен. не могу понять, почему.

также везде redux работает правильно, поэтому это не проблема в rootReducer или хранилище.

Вот кнопка:

 <button
    type="button"
    onClick={() => {
        if (
            this.props.login.role === "admin" ||
            this.props.login.role === "editor"
        ) {
            this.showDrawer();
        } else {
            toast.info("אין הרשאות", {
                position: "top-center",
                autoClose: 2500,
                hideProgressBar: false,
                closeOnClick: true,
                pauseOnHover: true,
                draggable: true,
                progress: undefined,
            });
        }
    }}
    className="btn btn-outline-warning"
>
    {this.props.login.role === "noob" ? "1" : "2"}
</button>
  

Вот сокращение:

 function mapStateToProps(state) {
    return { home: state.home, login: state.login };
}

function mapDispatchToProps(dispatch) {
    return {
        editSwitch: (SwData, newMac) =>
            dispatch(HomeActions.EditMacAdressOfSwitch(SwData, newMac)),
    };
}

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

Странная часть для меня заключается в том, что если я удаляю динамический текст из кнопки, он работает (все еще есть this.props в onClick, и он не определен). смотрите здесь, что я имею в виду :

 <button
    type="button"
    onClick={() => {
        if (
            this.props.login.role === "admin" ||   //this works right! how it is not undefined here?
            this.props.login.role === "editor"
        ) {
            this.showDrawer();
        } else {
            toast.info("אין הרשאות", {
                position: "top-center",
                autoClose: 2500,
                hideProgressBar: false,
                closeOnClick: true,
                pauseOnHover: true,
                draggable: true,
                progress: undefined,
            });
        }
    }}
    className="btn btn-outline-warning"
>
    static text // here's a static text
</button>
  

Я предполагаю, что я что-то упускаю из виду с привязкой «this», но я не могу ее получить. спасибо за вашу помощь (:

Комментарии:

1. видя только возврат jsx, трудно понять, какие значения доступны на this

Ответ №1:

В вашем методе рендеринга, если вы деконструируете prop как: const {role}=this.props.login и используете role вместо this.props.login.role , вы можете получить роль, как показано ниже:

 ...
 render() {
        const { role } = this.props.login
        return (
           
                <button
                    type="button"
                    onClick={() => {
                        if (
                            role === "admin" ||
                            role === "editor"
                        ) {
                            this.showDrawer();
                        } else {
                            toast.info("אין הרשאות", {
                                position: "top-center",
                                autoClose: 2500,
                                hideProgressBar: false,
                                closeOnClick: true,
                                pauseOnHover: true,
                                draggable: true,
                                progress: undefined,
                            });
                        }
                    }}
                    className="btn btn-outline-warning"
                >
                    {role === "noob" ? "1" : "2"}
                </button>
            
        );
    }
  

Ответ №2:

Итак, я обнаружил, что проблема заключается в том, что компонент отображается до загрузки данных (всех данных для входа). и из-за этого происходит неопределенное. теперь это работает (мне все еще не нравится это решение, но оно работает).

 <button
      type="button"
      onClick={this.showDrawer}
      className="btn btn-outline-warning"
    >
      {this.props.login === undefined
        ? "static"
        : this.props.login.role === "noob"
        ? "1"
        : "1"}
    </button>
  

Ответ №3:

Попробуйте использовать необязательную цепочку, поэтому вы должны использовать this.props?.login?.role, надеюсь, это решит вашу проблему

Комментарии:

1. Это всего лишь мера предосторожности для предотвращения undefined . Это не решает исходную проблему.