【问题标题】:Using Bootstrap Components with Reactjs使用带有 Reactjs 的引导组件
【发布时间】:2015-05-09 14:15:09
【问题描述】:

我有一个使用 Bootstrap 在 Symfony 框架上构建的社交网站。我阅读了 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>);
}  
});

使用此代码可以完美地使用下拉菜单,但这是在 react 中使用引导组件的正确方法吗?

2) 使用 react-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 的最佳方式是什么?我应该使用它还是直接使用引导组件?还有其他解决方案吗?

【问题讨论】:

  • 是的,您可以按照示例一中的方式使用 boostrap。这就是我使用它的方式。你的反应组件中还有一些刀片代码,你是在脚本标签中定义你的组件还是什么?
  • 是的,我正在使用脚本标签 :) 在脚本标签内我正在编写 JSX。从我所读到的关于反应的所有内容中,它使用了一个虚拟 dom。那么使用第一个示例,它不会尝试直接更改 DOM 吗?
  • 它将直接更改 DOM,但会计算最小的更改集以应用于 DOM 节点。所以它是这样的:你的应用程序中的变化 -> 虚拟 dom 找到变化 -> 更新 dom

标签: reactjs react-bootstrap


【解决方案1】:

在您的情况下,由于您只是在脚本标签中创建组件,因此使用引导类名称而不使用 react-bootstrap 包是可以的。没有错误或正确的方法。

使用 react-boostrap 非常好,因为它使您的代码更加模块化,并且您不必为更改样式而努力,因为一切都依赖于您传递给组件的状态和道具。

【讨论】:

  • 非常感谢!!我在使用 react-bootstrap 时遇到的错误怎么办?我应该将 React-bootstrap 组件与 const 一起使用,并且不将 React.createClass 与它们一起使用吗?并使用我给出的代码,css没有正确呈现
  • 我不知道你所说的使用 const 是什么意思。我没有使用过 react-boostrap。您能否提供一个小示例来显示您的问题,易于运行?
  • 我也经常看到使用 react-bootstrap 的一些错误。在这些情况下,我已经使用标准 div 和其他元素并直接使用引导 css/类。 DropownButton 有问题..当您选择其中一项时,它不会关闭下拉菜单。那里有一些选项,但在函数中添加了一个 onClick 处理程序,并且还在我的每个菜单项中添加了一个 data-dropdown='name' 。向点击处理程序传递与 data-dropdown 值匹配的元素。然后我用它来查找元素并调用它的 click() 方法来关闭下拉菜单。
猜你喜欢
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 2019-06-12
  • 2018-09-23
  • 2016-08-03
相关资源
最近更新 更多