Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.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

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 在React中使用document.getElementById是否为反模式?_Javascript_Reactjs_Dom - Fatal编程技术网

Javascript 在React中使用document.getElementById是否为反模式?

Javascript 在React中使用document.getElementById是否为反模式?,javascript,reactjs,dom,Javascript,Reactjs,Dom,我在我的React应用程序中的某个点上执行此操作: document.getElementById(element).scrollIntoView({ behavior: "smooth" }); 作为初学者,我有两个问题: 1) 这在React中被认为是不好的做法吗?我应该使用refs吗 2) 我是否在技术上使用这种技术以任何方式修改DOM?据我所知,我不是,但可能在后台发生了一些我不知道的事情。一般来说,refs比document.getElementById更好,因为它更符合react代

我在我的React应用程序中的某个点上执行此操作:

document.getElementById(element).scrollIntoView({ behavior: "smooth" });
作为初学者,我有两个问题:

1) 这在React中被认为是不好的做法吗?我应该使用refs吗


2) 我是否在技术上使用这种技术以任何方式修改DOM?据我所知,我不是,但可能在后台发生了一些我不知道的事情。

一般来说,refs比document.getElementById更好,因为它更符合react代码的其余部分

在react中,每个组件类都可以有多个组件实例。 使用id也是危险的,因为react不会阻止您在一个页面上有多个表单,然后您的DOM包含多个具有相同id的输入。这是不允许的

使用参照的另一个优点是,根据设计,只能在定义参照的上下文中访问参照。如果您需要访问此上下文之外的信息,这将强制您使用道具和状态(可能还有存储)。 这是一个优势,因为破坏单向数据流的机会较少/没有,这会使代码更难管理

注:在几乎所有情况下,REF都可以完全避免。正如Steve McGuire(Netflix的高级用户界面工程师)在reactjs conf 2016(视频中9:58m)中解释的那样,Netflix的设计原则是永远不使用参考文件。
在您的情况下,这意味着将电子邮件输入值置于表单的状态,添加onChange处理程序,并在提交事件中使用状态值。

糟糕的做法是,您将应用程序紧密地耦合到一个环境中,在该环境中,文档可以通过这些方法使用。您通常希望将这样的环境假设抽象出来,以便将来验证代码,这就是使用REF所做的。一般来说,即使您对文档始终存在相当有信心,这也是一个好习惯。没有scrollIntoView不会操纵Dom。因为这里的Dom不会发生变异,所以不太可能造成太多问题。但是,使用
refs
是正确的方法。非常感谢。因此,ref更可取,主要是因为它们不假设文档存在?实际上,DOM正在被操纵,就像
.style.color=“red”
操纵DOM一样。
.scrollTop
值正在更改。您仍然可以在内部使用
refs
,但从您的编码角度来看,它们将由组件控制。IOW:您避免使用
refs
,因为您有一个处理refs的集中组件。因此,让我们假设您以后想将应用程序转换为React Native(可能是React Native,不确定),但这可能会使scrollIntoView有所不同,那么您有一个组件要更新,而不是使用了大量的页面,这是一件好事。非常感谢。你提到Netflix关于避免裁判的谈话真有趣。这就是为什么我要问这个问题,为什么我要尽量避免裁判,但在某些情况下,我只是不知道怎么做。我不知道您所说的“在您的情况下,这意味着将电子邮件输入值置于表单的状态,添加onChange处理程序,并在submit事件中使用状态值”的确切含义?我试图在提交时滚动到一个元素,我的问题是,我有很多元素,所以我试图避免引用,但是如果我不应该使用
document
ids
我不知道如何找到元素并滚动到它