Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我如何才能对替换(而不是合并)VDOM做出反应?_Javascript_Reactjs - Fatal编程技术网

Javascript 我如何才能对替换(而不是合并)VDOM做出反应?

Javascript 我如何才能对替换(而不是合并)VDOM做出反应?,javascript,reactjs,Javascript,Reactjs,我有一个组件,在componentDidMount中,它为jQuery插件提供了对React呈现的DOM的一些控制。我知道每个人都说“除了React,别让任何东西碰DOM”,但请听我说,因为重新发明这个插件现在是不可行的,我认为React应该有一个“覆盖在DOM中找到的任何东西”开关,我希望有人能指给我 更多信息:我设计它是为了让React的DOM状态完全由React提供的道具决定,除非用户在拖拽东西。一旦删除,我不关心自上次React更新以来DOM如何更改,我只想呈现React当前道具的所有内

我有一个组件,在
componentDidMount
中,它为jQuery插件提供了对React呈现的DOM的一些控制。我知道每个人都说“除了React,别让任何东西碰DOM”,但请听我说,因为重新发明这个插件现在是不可行的,我认为React应该有一个“覆盖在DOM中找到的任何东西”开关,我希望有人能指给我

更多信息:我设计它是为了让React的DOM状态完全由React提供的道具决定,除非用户在拖拽东西。一旦删除,我不关心自上次React更新以来DOM如何更改,我只想呈现React当前
道具的所有内容,我将通过
ReactDOM.render将其传递给插件的
change
处理程序

症状是插件在拖动期间和之后创建的节点在React被告知更新后不会消失

是,节点最初是
-ed

插件是可嵌套的,它增加了交互性(树的拖放重新排序),JSBin在这里:


我真的在找“发现什么就杀什么”的场景。我以为调用
ReactDOM.render
就可以了,但显然不行。当然,这两种情况都不是手术式的,但我没想到它会这样。提前感谢所有“您做错了”的建议和其他修复方法

componentDidMount
中手动添加
div
元素,并在
componentdiddupdate
中用新元素替换它:

class Foo extends React.Component {
    render() {
      // whatever HTML you want...
      return (
        <div>
          <div>
            {/* this div will contain our non-React stuff that we need to reset */}
            <div ref="container"></div>
          </div>
        </div>);
    }

    blastAndRecreate() {
      // throw away any content within the container and replace it with brand new content
      const container = $(this.refs.container).empty();
      const newDIV = $("<div>").appendTo(container);

      // give this new DIV to nestable plugin
      newDIV.nestable(...);
    }

    componentDidMount() {
      this.blastAndRecreate();
    }

    componentDidUpdate() {
      this.blastAndRecreate();
    }
}
类Foo扩展了React.Component{
render(){
//无论你想要什么HTML。。。
返回(
{/*这个div将包含我们需要重置的非React内容*/}
);
}
blastAndRecreate(){
//扔掉容器内的任何内容,并用全新内容替换
const container=$(this.refs.container).empty();
const newDIV=$(“”)。appendTo(容器);
//将此新DIV指定给nestable插件
newDIV.nestable(…);
}
componentDidMount(){
这个.blastAndRecreate();
}
componentDidUpdate(){
这个.blastAndRecreate();
}
}

您是否可能走错了方向?我并不是想成为一个混蛋,我只是想知道,如果你的应用程序如此依赖jQuery插件,为什么还要使用React。我相信你有理由,但我想我真的应该回到这里。我知道这不能马上帮到你。托德,谢谢。我的目标是在这个JQuery插件上创建一个干净的React包装器,这样它就可以与系统的其余部分组成。但是,也许需要进行一次完整的迁移?也许,如果目标是查看React的性能优势,那么这个项目不会真正显示这一点,因为您的应用程序的状态是由jQuery插件管理的。React实际上只是渲染(可能有点慢)结果,它没有使用它的内部diff算法。我明白了,那么您希望能够将这个jQuery插件作为一个组件包含在更广泛的React系统中吗?我认为这可能不是一个简单的解决办法,完全迁移可能是唯一的方法,但也许可以暂时尝试下面的答案。
unmountComponentAtNode
不是更惯用一点吗?我的意思是-既然我们已经在JQuery领域了,再多一点也不会有什么坏处,但是我遇到了一些错误,比如
Uncaught Error:invalition:processUpdates():找不到元素的子元素0。这可能意味着DOM意外地发生了变异(例如,通过浏览器)
试图进一步变异DOM-您对此有何看法?您应该编辑您的帖子以包含一些相关的代码谢谢@Brandon-当
empty()
遇到麻烦时,我使用了组件卸载。以下是我如何度过这段时间的完整记录: