reactjs - 如何让简单的表单更像 React? (DOM节点丢失)

标签 reactjs

我正在转换几年前做的一些 HTML/JS 表单,作为 React.js 学习练习,我遇到了一个绊脚石,我想了解其原因。

基本上,就像最初一样,我有一个选择,您可以在其中选择要显示的表单。选择的 onchange 处理程序显示所选表单并隐藏其他表单。因此,我对此进行 React 改造的第一步是将表单制作成 React 组件,效果很好。我留下这个作为我的 HTML:

<body>
    <div id="main">
        <select id="calculations" onChange="handleSelect();">
            <option value="" selected="selected">SELECT CALCULATION FORM</option>
            <option value="1">Enter pace and distance to get a total time</option>
            <option value="2">Enter distance and target time to get the required pace</option>
            <option value="3">Enter pace and time to get the distance run</option>
            <option value="4">Convert mph to mins/mile</option>
            <option value="5">Convert mins/mile to mph</option>
        </select>

        <div id="calcForm"/>

    </div>

</body>

这是 JS:

window.handleSelect=function(){
    var selected=$("#calculations").val();
    if(selected!=""){
        React.render(React.createElement(CalcForm, {selected: selected, distances: distances}),document.getElementById('calcForm'));
    } else {
        $("#calcForm").html("");//clear it
    }
};

不过,在我尝试将主要选择放入 React 组件来完成工作时,我感到很沮丧。我尝试创建一个 SelectCalc 组件并像这样使用它:

<body>
    <div id="main">

        <div id="selectCalc"/>  
        <div id="calcForm"/>

    </div>

</body>

在我的 app.js 中,我有这个:

React.render(React.createElement(SelectCalc,null), document.getElementById('selectCalc'));

我将handleSelect设为SelectCalc类的一个函数,这样当选择一个选项时,它会调用这个:

React.render(React.createElement(CalcForm, {selected: selected, distances: distances}),document.getElementById('calcForm'));

但这就是问题所在。这样做后,当我选择一个选项时,我收到错误:

错误:不变违规:_registerComponent(...):目标容器不是 DOM 元素。

有问题的目标容器是“calcForm”div,如 document.getElementById('calcForm') 中所标识。由于令我困惑的原因,这是空的(我在控制台中检查过)。然而它显然存在于 HTML 中,并且在 React 改造之前,我的更原始的选择更改处理程序成功地定位了它。

那么问题出在哪里呢?我在这里误解了什么?鉴于这是一个非常简单的 React.js 示例,我应该如何做呢?

非工作版本的 fiddle https://jsfiddle.net/JohnMoore/7rp3n1oy/2/ ,我希望 - 第一次使用 Fiddle(!),所以我希望它能显示这个问题。尝试运行它并选择其中一个选项,然后在控制台中查看错误。我注意到 JSFiddle 上还有一个前面的错误:“SyntaxError:预期表达式,得到 '<'”。我不得不说这对我来说没有多大意义,因为我本以为渲染返回的预期内容准确地说是一些以 < 开头的 HTML。我不知道这是否相关,或者是否是 Fiddle 环境的产物。

最佳答案

我通过删除 div 解决了这个问题s。它们将在 react 组件中动态创建。

Here是 fiddle 。

编辑:旧的不起作用,因为 <div id="selectCalc" />是“无效”html。它将被替换为 <div id="selectCalc">而不是<div id="selectCalc"></div> 。由于缺少结束标记,浏览器会忽略 <div ... /> 之后的所有内容。 。 -> <div id="calcForm" />不会出现在 DOM 中。

Here是带有更正的 html 标签的版本,但您应该更喜欢其他版本。

看看this有关 in/valid html 标签的更多信息。

关于reactjs - 如何让简单的表单更像 React? (DOM节点丢失),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30887319/

相关文章:

javascript - React 和 Electron 与 Bablify : Uncaught TypeError: fs. readFileSync 不是一个函数

html - 页脚出现在内容区域

javascript - react 引导模式 - 我如何让它显示?

javascript - 如何动态添加元素属性

javascript - React Recharts-从不同的数组名称获取数据

javascript - 在 React/TypeScript 中渲染一组组件?

javascript - 为什么表单收不到 AntD 中的选择数据?

javascript - 如何使用 React 单击文档中的任意位置关闭侧面板?

javascript - Next.js - _app.js 状态在页面刷新/SSR 时丢失

javascript - 为什么我的代码返回 React Type Error?