【发布时间】:2019-07-16 21:48:22
【问题描述】:
这是我创建复选框输入样式的组件。 一切正常,但出现此错误消息,我不知道为什么。
'未捕获的不变违规:目标容器不是 DOM 元素。'
Stackoverflow 要求我在提交此问题之前发布更多 cmets,但我确实没有更多信息可在此处设置...所以我将在此问题中发布我正在使用的版本。
React 版本:React v16.8.3
React DOM 版本:React v16.8.3
巴别塔:https://unpkg.com/babel-standalone@6.15.0/babel.min.js
/* global ReactDOM, React */
class Switch3dPermissao extends React.Component {
constructor(props) {
super(props);
this.state = { checked: props.defaultChecked };
}
toggle = () => {
this.setState({
checked: !this.state.checked
})
}
render() {
return (
<div>
<label className={'mr-3 switch switch-3d switch-'+this.props.type}>
<input type="hidden" name={this.props.id} value={this.props.offvalue} />
<input
id={this.props.id}
name={this.props.id}
value={this.props.value}
className="switch-input"
type="checkbox"
checked={ this.state.checked ? true : false }
onChange={ this.toggle }
/>
<span className="switch-label"></span>
<span className="switch-handle"></span>
</label>
<label htmlFor={ this.props.id } className="cursor-pointer" dangerouslySetInnerHTML={{ __html: this.props.html }}></label>
</div>
);
}
}
// Elementos com esta classe
var els = document.getElementsByClassName('switch-3d-permissao');
for (var i in els) {
var element = els[i];
// Is default checked?
var isChecked = false;
var value = '1';
if (element.attributes !== undefined) {
if (element.attributes.checked !== undefined) {
isChecked = true;
}
if (element.attributes.value !== undefined) {
value = element.attributes.value.textContent;
}
}
var id = null;
var type = 'danger';
var offvalue = '0';
if (element.dataset !== undefined) {
// data-id (The form checkbox id)
if (element.dataset.id !== undefined) {
id = element.dataset.id;
}
// data-type warning | danger | primary | info | success
if (element.dataset.type !== undefined) {
type = element.dataset.type;
}
// Valor para quando o checkbox nao esta checado
if (element.dataset.offvalue !== undefined) {
offvalue = element.dataset.offvalue;
}
}
ReactDOM.render(<Switch3dPermissao id={id} type={type} html={element.innerHTML} defaultChecked={isChecked} value={value} offvalue={offvalue} />, element)
}
【问题讨论】:
-
你想完成什么?我认为您正在混合反应和非反应的做事方式。 React 正在处理虚拟 DOM 并在状态更改时重新渲染元素,但是当您使用 getElementsByClassName 时直接操作 DOM,这不是正确的方法。
-
您是否有理由直接在元素上添加属性?您可以将这些保存在状态中。
-
我从 html 获取元素属性,因此当有人需要使用我的代码时,只需传递属性值即可根据需要创建元素。什么是“正确”的做法?
-
您可以将它们作为道具传递。假设您正在创建一个引导按钮,然后您想更改按钮的颜色,您可以将道具设置为“变体”,然后您可以传递“成功”或“危险”。您还可以在状态和按钮重新渲染中相应地更改这些。作为一般经验法则,您通常需要避免在 React 应用程序中直接操作 DOM
-
好的,给我几分钟。
标签: javascript html reactjs babeljs