当前位置: 首页 > 面试题库 >

使用在React Components中转换DOM的JQuery插件?

壤驷安和
2023-03-14
问题内容

一些JQuery插件不仅会向DOM节点添加行为,还会对其进行更改。例如,引导开关转向

<input type="checkbox" name="my-checkbox" checked>

变成像

<div class="bootstrap-switch bootstrap-switch-wrapper bootstrap-switch-on bootstrap-switch-large bootstrap-switch-animate">
  <div class="bootstrap-switch-container">
    <span class="bootstrap-switch-handle-on bootstrap-switch-primary">ON</span>
    <label class="bootstrap-switch-label">&nbsp;</label>
    <span class="bootstrap-switch-handle-off bootstrap-switch-default">OFF</span>
    <input type="checkbox" name="download-version" checked="" data-size="large" data-on-text="3" data-off-text="2.0.1">
  </div>
</div>

$("[name='my-checkbox']").bootstrapSwitch();

哪个与React不兼容:

Uncaught Error: Invariant Violation: findComponentRoot(..., .0): Unable to find
element. This probably means the DOM was unexpectedly mutated (e.g., by the
browser), usually due to forgetting a <tbody> when using tables or nesting <p> or
<a> tags. ...<omitted>...`.

是否有推荐的技术将这些插件合并到React组件中?还是他们从根本上打破了React的假设并且无法使用它?


问题答案:

不,React会对在React之外修改自己的组件dom结构的任何事物产生严重的反应(haha)。这是您永远不想做的事情。推荐的解决方案是在react中复制您尝试使用jquery或类似插件进行的操作的功能。

话虽如此,对于在某些情况下您无法做到这一点的特定情况,有一种合理的方法可以做到这一点,但这实际上意味着将一些未反应的dom包裹在react中。

例:

var Example = React.createClass({
    componentDidMount: function() {
        var $checkboxContainer = $(this.refs.checkboxContainer.getDOMNode());

        var $checkbox = $('<input />').prop('type', 'checkbox');

        $checkboxContainer.append($checkbox);

        $checkbox.bootstrapSwitch({});
    },
    render: function() {
        return (
            <div>
                <div ref="checkboxContainer"></div>
            </div>
        )
    }
});

当然,现在您正在使用嵌套的div渲染组件。嵌套div第一次安装到dom时,嵌套将由jquery附加到其复选框,然后该复选框还将在其上执行我们的jquery插件。

这个特定的示例组件没有什么意义,但是您可以看到它如何集成到一个更复杂的组件中,同时仍然允许您重新渲染并响应状态更改等。您只是失去了直接对事件/修改做出反应的能力就反应而言,该复选框内的内容不存在。

现在,在上面的示例中,如果您需要一些反应逻辑来添加/删除嵌套的div,则必须在插入的div周围具有相同的逻辑,以负责重新插入复选框并使用来重新初始化该复选框。
jQuery插件。但是,由于react仅在需要时修改dom,因此除非您html" target="_blank">执行某种操作以使容器div导致将其删除/重新呈现到dom的方式进行修改,否则不会删除此插入的dom内容。这意味着您仍然可以访问该容器div等的react中的所有事件。

您还可以利用该componentDidMount函数来将事件或回调绑定到复选框本身上的特定交互。只要确保componentWillUnmount在特定情况下在组件生命周期中的正确位置或有意义的任何位置正确地取消绑定它们即可。



 类似资料:
  • 问题内容: 假设我使用jQuery将新内容加载到特定的DIV元素中。如果现在我想从该DIV元素内部捕获事件,我认为必须以某种方式更新DOM?处理此问题的最佳方法是什么? 编辑:这是我的意思的示例: 同一级别的文件包含 文件“视图”包含 如果您尝试此操作,则将在您第一次按下Edit时看到该按钮变为View,但之后不再更改。为什么是这样? 问题答案: 像这样使用live:

  • 问题内容: 我正在尝试使用jquery获取一个元素来设置旋转悬停效果的动画,我将对此jsFiddle进行测试。到目前为止,我有这个: 但是它似乎根本没有旋转它,我知道设置css的正确方法是: -webkit-transform:旋转(30deg); 我已经试过了: 但是即使高度也不会改变 任何建议将帮助谢谢! 问题答案: 使用出色的jQueryRotate插件。所有主流浏览器均支持 要旋转图像,您

  • 问题内容: 我正在使用jquery tablesorter插件并将其应用于ID为#table的表 我的搜索工具通过ajax请求结果,并使用具有相同ID的新表替换该表 如果我的代码是这样的: 我要添加什么以使插件在新表上工作?(我知道jquery的实时事件,但是在这种情况下该如何使用呢? 问题答案: 您必须在搜索请求完成后重新运行。 });

  • 本文向大家介绍如何使用jQuery将元素插入DOM?,包括了如何使用jQuery将元素插入DOM?的使用技巧和注意事项,需要的朋友参考一下 在某些情况下,您想在现有文档中插入一个或多个新DOM元素。jQuery提供了多种在不同位置插入元素的方法。 after(content)方法将内容插入每个匹配的元素之后,而before(content)方法将内容插入每个匹配的元素之前。 后内容 after(c

  • 问题内容: 我想在有角度的应用程序中使用jquery的UI布局插件。是否有角指令已执行此操作或具有相同目的? 问题答案: 这里是为健壮的体系结构而构建的,这就是为什么我们在指令和其他组件方面看到如此多的模块的原因。忍受它就像离开他们的核心设计一样,您最终会陷入混乱,无法维护代码库。 如果您正在编写AngularJS应用程序,则jQuery至关重要。 如果您要启动一个应用程序,请仔细阅读ng- bo

  • 问题内容: 我有一个PrimeFaces Web应用程序。当我手动添加jQuery和如下所示的插件时, 然后PrimeFaces组件会失去其功能和某些样式。例如,不显示,不滑动,丢失填充等。 这是怎么引起的,我该如何解决? 问题答案: PrimeFaces已经附带捆绑了jQuery的产品,但是您已经下载并安装了另一个仅与PrimeFaces捆绑的jQuery冲突的产品。我敢肯定,如果您对Web浏览