【问题标题】:React applying JQuery code to an element inside a componentReact 将 JQuery 代码应用于组件内的元素
【发布时间】:2016-12-26 12:39:37
【问题描述】:

我有一个使用 React 的应用程序。我现在在尝试实现 bootstrap-wysiwyg/bootstrap3-wysiwyg 包时遇到问题。

为了让我的<textarea> 作为ootstrap-wysiwyg/bootstrap3-wysiwyg 文本编辑器工作,我需要在文本编辑器上运行以下 JQuery 函数:

$(".textarea").wysihtml5()

这是我的组件:

import React, { Component } from 'react'

export class MyTextEditor extends Component {
    render() {
        return (
            <div className="form-group">
                <textarea className="textarea"></textarea>
            </div>
        )
    }
}

如何在 React 组件中将该 JQuery 函数应用到我的 &lt;textarea&gt;

我知道混合 React 和 JQuery 不是很好的做法,但我真的需要它来工作。如果有另一种方法可以让包工作,我会很感激作为答案。

否则,如果有人可以帮助我使其工作,将不胜感激!

更新: (仍在寻找)

感谢所有建议。我尝试了很多,但它们都导致了问题:

  1. &lt;ReactQuill&gt; 就是显示不好,按钮太大了。
  2. &lt;EditableDiv&gt; 给我:Uncaught Error: addComponentAsRefTo(...): Only a ReactOwner can have refs.
  3. Syam Mohan 的回答给了我:Uncaught TypeError: Cannot read property 'font-styles' of undefined at f

仍在寻找可行的方法,感谢您迄今为止所做的所有努力!

【问题讨论】:

  • 我先看看react versions,看看你能不能用。
  • 我在实现 &lt;ReactQuill /&gt; 时遇到了一些麻烦。我应该提到我的文本编辑器出现在模式上。 ReactQuill 按钮很大。
  • @MartinMazzaDawson 使用&lt;EditableDiv&gt; 给了我以下错误:Uncaught Error: addComponentAsRefTo(...): Only a ReactOwner can have refs. 不确定这是从哪里来的,但基本上如果我使用&lt;EditableDiv&gt; 会发生错误,如果不是我的应用程序运行没有错误。
  • 当一个库修改 DOM 时,我们试图让 React 远离它。您需要创建一个组件来管理 jQuery 插件,主要是通过使用 componentDidMount/componentWillUnmount 来初始化/销毁第三方库。在这里查看我的答案:stackoverflow.com/a/40350880/1333836

标签: jquery twitter-bootstrap reactjs bootstrap-wysiwyg


【解决方案1】:

试试这个:

import React, { Component } from 'react';
import $ from 'jquery'; 

export class MyTextEditor extends Component {

  componentDidMount() {
    $(".textarea").wysihtml5()
  }

  render() {
    return (
        <div className="form-group">
            <textarea className="textarea"></textarea>
        </div>
     )
  }
}

注意:不要忘记添加 JQuery 库

【讨论】:

  • Syam Mohan,你能解释一下如何将 jQuery 库添加到 React 应用程序吗?谢谢。
  • 这样做会在控制台中出现以下错误:Uncaught TypeError: Cannot read property 'font-styles' of undefined at f
  • 如何将 jQuery 库添加到 React 应用程序? -import $ from jquery。但这不是一个好方法。请在 OP 帖子下方查看我的评论
  • 您可以通过切换到 boostrap-wysiwyg 包的 bootstrap3-wysiwyg-commonjs 分支来清除“字体样式”错误:github.com/sharathprabhal/bootstrap3-wysiwyg-commonjs。见github.com/bootstrap-wysiwyg/bootstrap3-wysiwyg/issues/207
【解决方案2】:

添加和导入 JQuery 是第一部分

1) 使用webpack 我看到的最好方法是在您的webpack.config.js 中添加一个插件:

var webpack = require('webpack');

module.exports = {
    plugins: [
        new webpack.ProvidePlugin({
            '$': 'jquery',
            'jQuery': 'jquery',
            'window.jQuery': 'jquery'
        })
    ]
};

所有这些不同的错别字都是为了使 JQuery 可用性与各种模块兼容。 当然你需要npm installjquery和你的插件(wysihtml5)。

2) 或者您可以将其导入您的index.html&lt;script src="jquery-3.1.1.min.js"&gt;&lt;/script&gt;

编辑:3) 使用流星我做了meteor add jquery 并且成功了。

那么,第二部分就是在React中使用它。

要在元素上使用 jquery 插件,您需要先渲染它,这就是为什么您需要将代码放在 componentDidMount 中(在第一次渲染之后运行)。 我会建议你(基于我在必须做与你相同的事情但使用bootstrapTable 时的不同搜索)使渲染部分最简单(通过删除)并使用ReactDOM.findDOMNode(this) 作为JQuery 的选择器:

import React, { Component } from 'react'
import ReactDOM from 'react-dom'

export class MyTextEditor extends Component {

    componentDidMount() {
        $(ReactDOM.findDOMNode(this)).wysihtml5()
    }

    render() {
        return (
            <textarea className="textarea"></textarea>
        )
    }
}

编辑:或者使用 React 的 refs

import React, { Component } from 'react'

export class MyTextEditor extends Component {

    componentDidMount() {
        $(this.refs.textareaIWantToUse).wysihtml5()
    }

    render() {
        return (
            <div className="form-group">
                <textarea className="textarea" ref="textareaIWantToUse"></textarea>
            </div>
        )
    }
}

【讨论】:

  • 我正在使用 Meteor,所以它有点不同,&lt;textarea&gt; 是表单的一部分,所以我更愿意将它保存在我设置它的组件中。
  • 我相应地编辑了帖子,我也用流星添加了这个问题
  • 我会在确认此解决方案有效后通知您。
  • 所以这个更新的答案给了我以下错误:Exception from Tracker recompute function: TypeError: $(...).wysihtml5 is not a function
  • 您的项目/html 中包含哪些脚本?在github.com/jhollingworth/bootstrap-wysihtml5 上,它说要添加wysihtml5jquerybootstrapbootstrap-wysihtml5,其中一个可能会丢失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 2019-06-22
  • 1970-01-01
相关资源
最近更新 更多