【发布时间】:2018-12-20 14:31:17
【问题描述】:
我正在尝试处理一个使用大量 jQuery 的布局/模板的项目。
我已经学会了将模板与 ReactJS 项目集成,但是,我正在寻找一个可以完全替换 jQuery 的解决方案。
我的一个解决方案是在 React 的 ComponentDidMount() 或 Render() 函数中使用 jQuery 函数。
这种方法正确吗?方法对吗?
我在下面附上了一个小例子:
import React, { Component } from 'react';
import '../stylesheets/commonstyles.css';
import '../stylesheets/bootstrap-sidebar.css';
import '../stylesheets/sidebar1.css';
import $ from 'jquery';
class NavBar extends Component {
constructor(props){
super(props);
this.openSidebar = this.openSidebar.bind(this);
}
openSidebar(){
console.log('hello sidebar');
}
componentWillMount(){
$(document).ready(function () {
$('#sidebarCollapse').on('click', function () {
$('#sidebar').toggleClass('active');
});
$('.search-btn').on("click", function () {
$('.search').toggleClass("search-open");
return false;
});
});
}
这是我的Render 函数。
{/* <!--- SIDEBAR -------> */}
<div class="wrapper" style={{paddingTop:60}}>
{/* <!-- Sidebar Holder --> */ }
<nav id="sidebar">
<div class="sidebar-header">
<h3>Dashboard</h3>
<strong>BS</strong>
</div>
<ul class="list-unstyled components">
<li class="active">
<a href="#homeSubmenu" /*data-toggle="collapse" */ aria-expanded="false">
<i class="ti-home"></i>
Home
</a>
<ul class="collapse list-unstyled" id="homeSubmenu">
<li><a href="#">Home 1</a></li>
<li><a href="#">Home 2</a></li>
<li><a href="#">Home 3</a></li>
</ul>
</li>
<li>
<a href="#" style={{color:"white"}}>
<i class="ti-align-justify" ></i>
About
</a>
<a href="#pageSubmenu" /*data-toggle="collapse" */ aria-expanded="false" style={{color:"white"}}>
<i class="ti-text"></i>
Pages
</a>
<ul class="collapse list-unstyled" id="pageSubmenu">
<li><a href="#">Page 1</a></li>
<li><a href="#">Page 2</a></li>
<li><a href="#">Page 3</a></li>
</ul>
</li>
<li>
<a href="#" style={{color:"white"}}>
<i class="ti-paragraph"></i>
Portfolio
</a>
</li>
<li>
<a href="#" style={{color:"white"}}>
<i class="ti-control-play"></i>
FAQ
</a>
</li>
<li>
<a href="#" style={{color:"white"}}>
<i class="ti-share-alt"></i>
Contact
</a>
</li>
</ul>
</nav>
{ /* <!-- Page Content Holder --> */ }
<div id="content">
</div>
</div>
【问题讨论】:
-
呃,别这样。使用 jQuery 或 React,不能同时使用(与 Angular 或 Vue 相同)
-
否,因为这并不能明确解决 OP 的问题,也不能使他们的代码正常工作。他们需要用 React 重写 everything 并完全放弃 jQuery,但我不会在我的回答中这样做:)
-
正如 Jeremy 所说 - 你不应该在反应中使用 jQuery。在您的示例中,您直接在 dom 中使用 jquery 安装 js 函数。任何直接的 dom 操作通常都是一个非常糟糕的主意,最终会以糟糕的渲染告终,并且随着状态的改变而消失。
-
删除 Jquery,用反应状态替换你的点击切换,就像这个答案:stackoverflow.com/questions/42630473/react-toggle-class-onclick
-
@JeremyThille 评论应该是答案。此外,如果这个组件在某个时候重新挂载,它将会有尽可能多的僵尸事件使您的应用程序越来越慢。为了防止这种情况,不要忘记使用
$.off。但是你不应该使用 jQuery,因为它被许多用户认为已弃用:css3/webpack/querySelector/querySelectorAll/ReactJS/vue/....
标签: javascript jquery reactjs