Флажок React Bootstrap в Nav -> NavItem не перерисовывается при нажатии

У меня есть своеобразная проблема с использованием Nav и NavItem с флажком из React Bootstrap. Дело в том, что если я нажму непосредственно на флажок, а не на кнопку NavItem, флажок не будет отображаться правильно, но мое состояние обновилось.

Пример: Учитывая приведенный ниже код, я визуализирую компонент и нажимаю непосредственно на флажок. В этом случае showMap будет установлено на false, так как мы установили его на true в конструкторе, но флажок по-прежнему будет установлен в представлении html. Однако, если я нажму на NavItem, но не непосредственно на флажок, состояние showMap обновится правильно, а также вид.

https://react-bootstrap.github.io/components.html#navs

import * as React from "react";
import * as ReactDOM from "react-dom";
import { LinkContainer } from 'react-router-bootstrap';
import { Col, Nav, NavItem, Checkbox } from "react-bootstrap";

interface IProps {

}

interface IState {
    showMap: boolean
}

export class Menu extends React.Component<IProps, IState> {
    constructor(props: any) {
        super(props);
        this.state = {
            showMap: true
        }
    }

    toggleCheckbox = (event: any) => {
        event.preventDefault();
        this.setState({ showMap: !this.state.showMap });
    }

    render() {
        return (
            <div>
                <Nav bsStyle="tabs" activeKey="1">
                    <LinkContainer to="/test">
                        <NavItem eventKey="1">Test</NavItem>
                    </LinkContainer>
                    <LinkContainer to="/test2">
                        <NavItem eventKey="2">Test2</NavItem>
                    </LinkContainer>
                    <NavItem eventKey="3" onClick={this.toggleCheckbox}><Checkbox name="showMap" inline checked={this.state.showMap} readOnly >
                    Show Map </Checkbox></NavItem>
                </Nav>
            </div>
        )
    }
}

Обновление:

Пробовал и так, результат тот же:

import * as React from "react";
import * as ReactDOM from "react-dom";
import { LinkContainer } from 'react-router-bootstrap';
import { Navbar, Nav, NavItem, Checkbox } from "react-bootstrap";

interface IProps {

}

interface IState {
    showMap: boolean
}

export class Menu extends React.Component<IProps, IState> {
    constructor(props: any) {
        super(props);
        this.state = {
            showMap: true
        }
    }

    toggleCheckbox = (event: any) => {
        event.preventDefault();
        this.setState({ showMap: !this.state.showMap });
    }

    render() {
        return (
            <div>
                <Navbar>
                    <Nav bsStyle="tabs" activeKey="1">
                        <LinkContainer to="/test">
                            <NavItem eventKey="1">Test</NavItem>
                        </LinkContainer>
                        <LinkContainer to="/test2">
                            <NavItem eventKey="2">Test2</NavItem>
                        </LinkContainer>
                        <NavItem eventKey="5" onClick={this.toggleCheckbox}><input type="checkbox" name="showMap"
                            checked={this.state.showMap} readOnly />Show map</NavItem>
                    </Nav>
                   </Navbar>
            </div>
        )
    }
}

person Ogglas    schedule 04.11.2017    source источник
comment
@BenSmith Реализовал панель навигации, но все равно не повезло, если я отлаживаю код, я вижу, что onClick нажат, и флажок выглядит хорошо в представлении. Однако после того, как мой код onClick запустился, он сбрасывается, чтобы выглядеть так, будто ничего не изменилось, но состояние обновляется. Это происходит, даже если я запускаю event.preventDefault(); или нет.   -  person Ogglas    schedule 05.11.2017
comment
@GarryTaylor Пробовал с <input type="checkbox" name="showMap" checked={this.state.showMap} readOnly />, но он ведет себя так же.   -  person Ogglas    schedule 05.11.2017
comment
Я тоже поиграл с хорошим примером кода и коробки @GarryTaylor, и это похоже на проблему с библиотекой react-bootstrap.   -  person Ben Smith    schedule 06.11.2017


Ответы (1)


Создал проблему с React Bootstrap здесь. https://github.com/react-bootstrap/react-bootstrap/issues/ 2876

Однако они думали, что это связано с React, поэтому я создал с ними проблему https://github.com/facebook/react/issues/11539.

Однако команда React пришла к выводу, что это нативное поведение браузера.

Если кто-то окажется здесь, вот как я это исправил:

toggleCheckbox = (event: any) => {
    this.setState({ showMap: !this.state.showMap });
}

const showMapStyle: React.CSSProperties = {
    paddingTop: '15px',
    paddingBottom: '15px',
}

    ...
    </Nav>
    <div onClick={this.toggleCheckbox} role='button' style={showMapStyle}><input type="checkbox" name="showMap"
        checked={this.state.showMap} readOnly />Show map</div>
</Navbar>

Я также пытался добавить элемент li внутрь <Nav>, но потом получил предупреждение:

React не распознает реквизит activeKey в элементе DOM. Если вы намеренно хотите, чтобы он отображался в DOM как настраиваемый атрибут, вместо этого напишите его как activekey в нижнем регистре. Если вы случайно передали его из родительского компонента, удалите его из элемента DOM.

https://github.com/react-bootstrap/react-bootstrap/issues/ 2199

<li onClick={this.toggleCheckbox} role='button' style={showMapStyle}><input type="checkbox" id="showMap" name="showMap"
    checked={this.state.showMap} readOnly />Show map</li>
person Ogglas    schedule 08.12.2017
comment
Что ты в итоге сделал? Я столкнулся с той же самой проблемой. - person Chip Dean; 23.01.2019
comment
Я просто вставил li внутрь NavDropdown и теперь все работает. - person Chip Dean; 23.01.2019