Использование компонентов Bootstrap с Reactjs

У меня есть веб-сайт социальной сети, построенный на платформе Symfony с использованием Bootstrap. Я читал о React.js и теперь пишу часть представления, используя его. У меня есть несколько вопросов.

1) Могу ли я использовать компоненты начальной загрузки напрямую? Например-

var NavbarLeftMenuBar=React.createClass({
render: function() {
    return(<ul className="nav navbar-nav">
                <li><a data-toggle="modal" href="#myModal" id="help">Help</a></li>
                <li> <a href="" className="dropdown-toggle" data-toggle="dropdown">Menu <b className="caret"></b></a>
                    <ul className="dropdown-menu">
                        <li><a href="">Menu1</a></li>
                        <li><a href="">Menu2 </a></li>
                        <li><a href="">Menu3 </a></li>
                        <li><a href="">Menu4 </a></li>
                    </ul>
                </li>
           </ul>);
}
});
var NavbarSearchBar=React.createClass({
render: function() {
    var buttonStyle={ marginLeft:-20,borderLeft:0 };
    var ulStyle={marginLeft:-20,marginTop:12};
    return <form className="navbar-form navbar-left" id="search" role="search">
                <div className="form-group">
                    <input type="text" className="form-control" placeholder="Search" value="{%if query is defined%}{{query}}{%endif%}"/>
                    <input type="hidden" value="{%if searchin is defined%}{{searchin}}{%else%}1{%endif%}" id="searchin"/>
                </div>
                <span className="dropdown">
                    <button style={buttonStyle} type="button" className="btn btn-white dropdown-toggle text-info-all" data-toggle="dropdown"><span data-bind="label" className="{%if searchin is not defined%}fa fa-users {%elseif searchin==1%}fa fa-users{%else%} fa fa-bell-o{%endif%}"></span> <span className="caret"></span></button>
                        <ul style={ulStyle} className="dropdown-menu">
                            <li data-search="1"><a href="#"><span className="fa fa-users"></span> Search for Users</a></li>
                            <li data-search="2"><a href="#"><span className="fa fa-bell-o"></span> Search in Status</a></li>
                        </ul>
                </span>
                <button type="submit" className="btn btn-default" id="searchbutton">Submit</button>
            </form>;
}
});
var Navbar = React.createClass({
render: function() {
 return(<nav className="navbar navbar-default navbar-fixed-top" role="navigation">
        <div className="container">
        <div className="navbar-header">
        <a className="navbar-brand" href="{{path('homepage')}}">Brand Name</a>
        </div>
        <NavbarLeftMenuBar/>
        <NavbarSearchBar/>
        </div>
        </nav>);
}  
});

Выпадающие списки работают безупречно с использованием этого кода, но правильно ли это использовать компоненты начальной загрузки в реакции?

2) Использование response-bootstrap

Я также пробовал использовать React-bootstrap. Я столкнулся с несколькими проблемами при его использовании. Поскольку мне нужно отображать панель поиска на панели навигации, я должен использовать состояние для поиска. Кроме того, меню на панели навигации будет обновляться в соответствии с поведением. Использование React.createClass не работает.

 var NavbarLeftMenuBar=React.createClass({
     render: function() {
           return <Nav>
            <NavItem eventKey={1} href='#'>Help</NavItem>
            <DropdownButton eventKey={2} title='Dropdown'>
                    <MenuItem eventKey='1' href=''>Home</MenuItem>
                    <MenuItem eventKey='2' href=''>LInk2</MenuItem>
                    <MenuItem eventKey='3' href=''>Link3</MenuItem>
                    <MenuItem eventKey='4' href=''>Link4</MenuItem>
            </DropdownButton>
           </Nav>;
   }
   });
var NavbarSearchBar=React.createClass({
render: function() {
    var buttonStyle={ marginLeft:-20,borderLeft:0 };
    var ulStyle={marginLeft:-20,marginTop:12};
    return <form className="navbar-form navbar-left" id="search" role="search">
                <div className="form-group">
                    <input type="text" className="form-control" placeholder="Search" value="{%if query is defined%}{{query}}{%endif%}"/>
                    <input type="hidden" value="{%if searchin is defined%}{{searchin}}{%else%}1{%endif%}" id="searchin"/>
                </div>
                <span className="dropdown">
                    <button style={buttonStyle} type="button" className="btn btn-white dropdown-toggle text-info-all" data-toggle="dropdown"><span data-bind="label" className="{%if searchin is not defined%}fa fa-users {%elseif searchin==1%}fa fa-users{%else%} fa fa-bell-o{%endif%}"></span> <span className="caret"></span></button>
                        <ul style={ulStyle} className="dropdown-menu">
                            <li data-search="1"><a href="#"><span className="fa fa-users"></span> Search for Users</a></li>
                            <li data-search="2"><a href="#"><span className="fa fa-bell-o"></span> Search in Status</a></li>
                        </ul>
                </span>
                <button type="submit" className="btn btn-default" id="searchbutton">Submit</button>
            </form>;
}
});
var NavbarWindow =React.createClass({
    render:function() {
    return <Navbar brand={<a href="{{path('homepage')}}">Brand name</a>}>
            <NavbarLeftMenuBar/>
            <NavbarSearchBar/>
           </Navbar>;
   }
   }); 

Это не отображает CSS должным образом. Я не могу использовать только const varname = (code); потому что данные в строке меню изменятся, и мне придется обрабатывать данные, введенные пользователем в строке поиска. Иногда я даже получаю сообщение об ошибке Maximum call stack size exceeded error. Как лучше всего использовать React-bootstrap? Должен ли я вообще использовать его или использовать компоненты начальной загрузки напрямую? Какие-нибудь другие решения?


person programmer    schedule 09.05.2015    source источник
comment
Да, вы можете использовать ускорение, как в первом примере. Вот как я его использую. У вас все еще есть код лезвия в вашем реагирующем компоненте, вы определяете свой компонент в теге скрипта или что-то в этом роде?   -  person Jeremy D    schedule 09.05.2015
comment
Да, я использую тег скрипта :) Внутри тега скрипта я пишу JSX. Из всего, что я читал о React, он использует виртуальный дом. Итак, используя 1-й пример, не будет ли он пытаться напрямую изменить DOM?   -  person programmer    schedule 09.05.2015
comment
Он изменит модель DOM напрямую, но вычислит минимальный набор изменений, применяемых к узлу DOM. Вот так: изменения в вашем приложении - ›виртуальный дом найти изменения -› обновления дом   -  person Jeremy D    schedule 09.05.2015


Ответы (1)


В вашем случае, поскольку вы просто создаете свой компонент в теге сценария, использование имен классов начальной загрузки без использования пакета response-bootstrap - это нормально. Нет неправильного или правильного способа сделать это.

Использование response-boostrap - это хорошо, поскольку он делает ваш код более модульным, и вам не нужно жонглировать изменением стилей, поскольку все зависит от состояния и свойств, которые вы передаете своим компонентам.

person Jeremy D    schedule 09.05.2015
comment
Большое спасибо !! а как насчет ошибки, которую я получаю с помощью response-bootstrap? Должен ли я использовать компоненты React-bootstrap с const и не использовать с ними React.createClass? и используя код, который я дал в вопросе, css не отображается должным образом - person programmer; 10.05.2015
comment
Я не знаю, что вы имеете в виду, используя const. Я не использовал response-boostrap. Не могли бы вы привести небольшой пример, показывающий вашу проблему, легко выполнимый? - person Jeremy D; 10.05.2015
comment
Я тоже время от времени сталкивался с некоторыми ошибками при использовании response-bootstrap. В этих случаях я перешел к использованию стандартного div и других элементов и напрямую использовал загрузочные css / классы. У DropownButton есть проблемы ... он не закрывает раскрывающийся список, когда вы выбираете один из элементов. Есть несколько вариантов, но добавлен обработчик onClick к функции, а также добавлено data-dropdown = 'name' к каждому из моих пунктов меню. Обработчику кликов передается элемент, соответствующий значению раскрывающегося списка данных. Затем я использую это, чтобы найти элемент и вызвать его метод click (), который закрывает раскрывающийся список. - person user3317868; 02.07.2015