一些JQuery插件不仅向DOM node 添加行为,还改变它们.例如,Bootstrap Switch

<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();

Which doesn't jive 具有 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>...`. 

Is there a recommended technique for incorporating these plugins into React components? Or do they fundamentally break the assumptions of React and cannot work 具有 it?

推荐答案

不,react会对react之外修改其自身组件dom struct 的任何东西做出糟糕的react (哈哈).这是你永远不想做的事.推荐的解决方案是,在react中复制jquery或类似插件的功能.

话虽如此,对于某些特定的情况,有一种合理的方法可以做到这一点,在这些情况下,您不能没有它,但它本质上意味着在react中封装一些非react dom.

例子:

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时,该嵌套div将通过jquery附加一个复选框,该复选框还将在其上执行我们的jquery插件.

这个特定的示例组件没有什么意义,但是您可以看到,这可能会集成到一个更复杂的组件中,同时仍然允许您重新渲染和响应状态更改等.您只是失go 了直接响应事件/修改有关复选框内的内容的能力,就react而言,根本不存在.

现在,在上面的示例中,如果要使用一些react逻辑来添加/删除嵌套的div,那么必须在插入的div周围使用相同的逻辑,并负责重新插入复选框,并使用jquery插件重新初始化它.但是,由于react仅在需要时修改dom,因此不会删除插入的dom内容,除非您以某种方式修改容器div,从而将其删除/重新呈现到dom中.这意味着您仍然可以访问react for the container div等中的所有事件.

还可以使用react中的componentDidMount函数将事件或回调绑定到复选框本身的特定交互.只需确保在componentWillUnmount中或在特定情况下的组件生命周期中正确解除绑定即可.

Reactjs相关问答推荐

CSS转换不适用于React MUI对象

如何使用json将购物车数组传递到后台API

从`redux—thunk`导入thunk `在stackblitz中不起作用

以下代码是否存在安全问题?

在Reaction常量函数中未更新状态变量

如何使用Reaction Testing Library+Vitest正确更新单元测试中的输入?

为什么查询错误在处理后仍出现在控制台中?RTK查询+ React

Next.js Next-Auth登录函数重定向到http://localhost:3000/api/auth/error

在继承值更改时重置react 挂钩窗体字段值

阻止组件更新的多分派Redux Thunk或setState是否有任何问题

useState导致对函数的无休止调用

我在Route组件上使用元素属性,这样就不需要ID了吗?

React useEffect 问题...异步函数内的变量正在获取延迟的更新值

如何在 React Hook Form 中使用嵌套对象处理错误验证消息

ReactJS on AWS Amplify与EC2上的Spring boot服务之间的混合内容错误

有没有办法在用户离开页面时防止输入模糊?

图像路径很奇怪,部署 Next.js 应用程序后我看不到任何图像

不能在我的代码中使用 .给我一个警告!有人知道解决方案吗?

使用 React 中的功能组件更改另一个组件的状态

警告:您在没有 `onChange` 处理程序的情况下为表单字段提供了 `value` 属性