Условные выражения в Unstated (React)

Я учусь реализовывать Unstated в своем приложении реакции.

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

Это мой NoteContainer:

class NoteContainer extends Container {
    state = {
        title: 'My Note',
        desc: 'This note state is managed with unstated',
        isDisplaying: false,
    }

    constructor() {
        super()
        this.show = this.show.bind(this);
    }

    show() {
        this.setState({ isDisplaying: !this.state.isDisplaying })
        console.log(this.state);
    }
}

Как видите, это действительно просто, просто измените свойство isDisplaying в состоянии, чтобы я мог использовать его в компоненте Note.js для отображения заголовка и сообщения заметки, например:

class Note extends Component {
    state = {
        isShowing: false,
    }

    render() {
        if (this.state.isShowing) {
            return (
                <Subscribe to={[NoteContainer]}>
                    {noteContainer => (
                        <div className="container">
                            <p>{noteContainer.state.title}</p>
                            <p>{noteContainer.state.desc}</p>
                        </div>
                    )}
                </Subscribe>
            )
        }
        return (
                <Subscribe to={[NoteContainer]}>
                    {noteContainer => (

                        <div className="container">
                            <button className="btn btn-success" onClick={() => {
                                noteContainer.show();
                                this.setState({
                                    isShowing: noteContainer.state.isDisplaying,
                                })
                                console.log(this.state);
                            }}>
                                See Note!
                            </button>
                        </div>
                    )}
                </Subscribe>
            )
    }
}

Желаемая функциональность заключается в том, что, когда я нажимаю кнопку "См. Примечание"! Кнопка, она показывает заголовок и описание заметки над кнопкой, и если я нажимаю на нее снова, она скрывает их.

Тем не менее, я получаю, что он создает другой компонент подписки, и это, кажется, удаляет "См. Примечание!" часть кнопки. Вот изображение результата.

Проблема в том, что я не могу снова использовать кнопку, чтобы скрыть информацию о заметке, я явно неправильно использую компонент подписки, но я не могу придумать другой способ использования условного использования с использованием unstated, поэтому любая помощь по этому вопросу будет принята с благодарностью.

Заранее спасибо, хорошей недели!

2 ответа

Решение

Мне удалось решить это с помощью встроенного, если условно. Однако я не чувствую себя комфортно в этом решении, я хотел бы знать, как реализовать полное, если оно условное, поэтому, если кто-нибудь знает, пожалуйста, оставьте комментарий!

render() {
        return (
            <Subscribe to={[NoteContainer]}>
                {noteContainer => (
                    <div className="container">
                        <p>{noteContainer.state.isDisplaying ? noteContainer.state.title : ''}</p>
                        <p>{noteContainer.state.isDisplaying ? noteContainer.state.desc : ''}</p>
                        <button className="btn btn-success" onClick={() => {
                            noteContainer.show();
                        }}>
                            See Note!
                        </button>
                    </div>
                )}
            </Subscribe>
        )
    }

Это анти паттерн:

this.setState({ isDisplaying: !this.state.isDisplaying })

Сначала проверьте, а затем установите состояние:

let answer = this.state.isDisplaying ? true : false
this.setState({isDisplaying: answer})

Или используйте переменную prevState

this.setState((prevState, props) => ({
  isDisplaying: prevState.isDisplaying ? true : false
}));
Другие вопросы по тегам