Обратный вызов внутри renderToolbar в приложении Onsen UI + React не работает

Я пытаюсь использовать Onsen UI + React для приложения, которое должно иметь сплиттер и навигацию. Объект Page использует функцию renderToolbar, в которой определены кнопки с методом для открытия Splitter.

Это не когда я нажимаю на кнопку на панели инструментов, но работает, когда я нажимаю на кнопку со страницы. Зачем?

Вот полный код:

import React from 'react';
import ReactDOM from 'react-dom';
import {
    Toolbar, Page, Button, ToolbarButton, Icon, Input,
    Splitter, SplitterSide, SplitterContent
} from 'react-onsenui';

import SecondPage from './SecondPage'

export default class MainPage extends React.Component {

    constructor(props) {
        super(props);

        this.state = {
            isOpen: false
        };

        this.show = this.show.bind(this);
    }

    /**
     * Show side menu
     */
    show() {
        this.setState({
            isOpen: true
        });
    }

    /**
     * Hide side menu
     */
    hide() {
        this.setState({
            isOpen: false
        });
    }

    /**
     * Push page to navigation stack
     */
    pushPage() {
        this.props.navigator.pushPage({component: SecondPage});
    }

    /**
     * Render top toolbar (action bar)
     */
    renderToolbar() {
        return (
            <Toolbar>
                <div className="right">
                    <ToolbarButton onClick={this.show}><Icon icon='menu'/></ToolbarButton>  <--- DON'T WORK!
                </div>
            </Toolbar>
        );
    }

    render() {
        return (
            <Splitter>
                <SplitterSide
                    side='left'
                    collapse={true}
                    isOpen={this.state.isOpen}
                    onClose={this.hide.bind(this)}
                    isSwipeable={true}>
                    <Page>
                        <div>Menu content</div>
                    </Page>
                </SplitterSide>
                <SplitterContent>
                    <Page renderToolbar={this.renderToolbar}>
                        <div>Main content</div>
                        <Button onClick={this.show}>Open</Button>  <--- WORK!
                    </Page>
                </SplitterContent>
            </Splitter>
        );
    }
}

1 ответ

После многих вариантов я понял, что функция renderToolbar также должна иметь привязку, поэтому, наконец, код:

import React from 'react';
import ReactDOM from 'react-dom';
import {
    Toolbar, Page, Button, ToolbarButton, Icon, Input,
    Splitter, SplitterSide, SplitterContent
} from 'react-onsenui';

import SecondPage from './SecondPage'

export default class MainPage extends React.Component {

    // const rightDirect = "right";
    constructor(props) {
        super(props);

        this.state = {
            isOpen: false
        };

        this.hide = this.hide.bind(this);
        this.show = this.show.bind(this);
        this.renderToolbar = this.renderToolbar.bind(this);
    }

    /**
     * Show side menu
     */
    show() {
        this.setState({
            isOpen: true
        });
    }

    /**
     * Hide side menu
     */
    hide() {
        this.setState({
            isOpen: false
        });
    }

    /**
     * Push page to navigation stack
     */
    pushPage() {
        this.props.navigator.pushPage({component: SecondPage});
    }

    /**
     *
     */
    renderToolbar() {
        console.log('Render TB', this);
        return (
            <Toolbar>
                <div className="right">                        
                    <ToolbarButton onClick={this.show}><Icon icon='menu'/></ToolbarButton>
                </div>
            </Toolbar>
        );
    }

    /**
     *
     * @returns {XML}
     */
    render() {
        return (
            <Splitter>
                <SplitterSide
                    side='left'
                    collapse={true}
                    isOpen={this.state.isOpen}
                    onClose={this.hide}
                    isSwipeable={true}>
                    <Page>
                        <div>Menu content</div>
                    </Page>
                </SplitterSide>
                <SplitterContent>
                    <Page renderToolbar={this.renderToolbar}>
                        <div>Main content</div>
                    </Page>
                </SplitterContent>
            </Splitter>
        );
    }
}
Другие вопросы по тегам