React.js 设置输入值

Posted

技术标签:

【中文标题】React.js 设置输入值【英文标题】:React.js setting value of input 【发布时间】:2015-08-21 09:55:11 【问题描述】:

我是 react.js 的初学者,这很神奇,但我面临一个真正的问题:我需要使用纯 javascript 设置输入的值,但由于某种原因,react.js 无法按预期工作。举个例子:打开这个网址http://autoescolalatorreta.wix.com/latorreta#!contact/c24vq

您将看到一个“电子邮件”输入字段,其 id 为“CntctFrm2emailField”。我尝试使用带有此代码的 javascript 更改它的值:

document.getElementById("CntctFrm2emailField").value = "testing@gmail.com";

但由于某种原因,React.js 并没有在其核心原因上更新此值,如果您尝试发送表单(单击“发送”按钮),您将看到它将显示一条错误消息,指出电子邮件未填写正确的。但是,一旦我在电子邮件字段中单击并输入任何字母并单击“发送”按钮,它就可以正常工作,我的意思是,React.js 会看到新值。

那么如何更改输入值并让 React.js 也更新该值?

【问题讨论】:

如果您在其他cmets中提到的代码无法发布,我担心您的问题不适合本网站,建议您删除它。 【参考方案1】:

对于 React 16,使用以下代码。检查this issue。

function setNativeValue(element, value) 
    let lastValue = element.value;
    element.value = value;
    let event = new Event("input",  target: element, bubbles: true );
    // React 15
    event.simulated = true;
    // React 16
    let tracker = element._valueTracker;
    if (tracker) 
        tracker.setValue(lastValue);
    
    element.dispatchEvent(event);


var input = document.getElementById("ID OF ELEMENT");
setNativeValue(input, "VALUE YOU WANT TO SET");

【讨论】:

._valueTracker 是语言本身的一部分还是 react 的助手? AFAIK 不是 JavaScript 或标准 DOM 属性的一部分 只模拟点击怎么样?这行不通,因为我们没有输入权?【参考方案2】:

如果输入不是html形式,那么你应该这样做:

document.getElementById("CntctFrm2emailField")[0].value = "testing@gmail.com";

这应该可以工作

【讨论】:

这在几个方面都是错误的。首先 getElementById() 不会返回类似数组的对象,因此 [0] 下标将导致未定义,并在尝试访问 value 时触发异常。其次,正如其他答案所述,简单地设置由 React 呈现的字段元素的 value 属性是行不通的。【参考方案3】:

首先,你永远不应该在 React.js 中使用“文档”对象。这是一个很大的不。你也不应该访问 DOM 元素,但是如果你知道你在做什么(比如动画),你应该创建“ref”对象,这不是主题,以访问 DOM 元素。

首先你应该在你的表单的状态对象中有一个对象。假设您的表单中有“用户名”和“密码”字段。

state=form:username:"","password:""

因为输入字段有自己的状态,所以我们输入的任何内容都会存储在输入字段中。我们应该摆脱输入字段的状态,只依赖状态对象。我们希望有单一的事实来源,因此将“输入”转换为“受控元素”。受控元素没有自己的状态,它们通过 props 获取所有数据,并通过引发事件来通知数据的更改。我们正在使用“value”道具来设置输入值。 由于输入字段被初始化为空字符串,我们将无法在输入字段中键入内容。解决方案是我们必须动态处理输入字段的更改事件。

handleChange=e=>
    const form=...this.state.form
    form[e.currentTarget.name]=e.currentTarget.value
    this.setState(account)

<input value=this.state.form.username change=this.handleChange name="username"/>
<input value=this.state.form.password change=this.handleChange name="password" />

【讨论】:

【参考方案4】:

我需要提交一个表单以进行一些监控。我是这样做的:

$("input[type=email]").value = "me@something.com"
$("input[type=email]").defaultValue = "me@something.com"
$("input[type=password]").value = "mystellarpassword"
$("input[type=password]").defaultValue = "pinpmystellarpasswordss"
$("input[type=email]").dispatchEvent(new Event('input', target: $("input[type=email]"), bubbles: true ));
$("input[type=password]").dispatchEvent(new Event('input', target: $("input[type=password]"), bubbles: true ));
$("button.login").click()

请注意,对于我登录的网站,我必须同时设置 value 和 defaultValue。 input.value 绑定了一些额外的验证逻辑

【讨论】:

【参考方案5】:

我已经编写并使用此函数来触发字段的更改状态:

function doEvent( obj, event ) 
    /* Created by David@Refoua.me */
    var event = new Event( event, target: obj, bubbles: true );
    return obj ? obj.dispatchEvent(event) : false;

像这样使用它:

var el = document.getElementById("CntctFrm2emailField");
el.value = "testing@gmail.com";
doEvent( el, 'input' );

【讨论】:

【参考方案6】:

这是你问题的关键,

但由于某种原因,React.js 并未在其核心上更新此值

主要原因是 react 在“shadow dom”中工作,而你的

document.getElementById("CntctFrm2emailField").value = "testing@gmail.com";

Inst 以任何方式更新 reacts 值,只是窗口 dom 对象。

React 内置了更新输入值的函数。试试这个方法。

查看此页面以获取有关反应表单的更多信息: https://facebook.github.io/react/docs/forms.html#controlled-components

【讨论】:

感谢您向我解释,确实有一个带有反应的“虚拟 dom”,这就是让它如此快速的原因。但我认为我需要的是在该输入中触发更改事件。我已经尝试过使用普通的 javascript .onchange() 进行调整,但它不起作用。我想我需要用 react.js 来触发它。你能帮我解决这个问题吗?我不敢相信使用 react.js 更新输入值是如此困难 如果您需要帮助,我需要查看代码...但是,查看站点,整个表单是一个名为 ContactForm 的反应组件,输入事件也由反应处理(@ 987654324@)。你用的是js还是jsx? 我很想向您展示代码,但我不知道这个表单是如何编程的,因为我今天第一次听说 react.js。我什至没有在电子邮件输入周围看到
标记。在您的浏览器中,您看到一个表格吗?我现在触发了 onclick 和 onchange ,不幸的是它也不起作用......还有其他想法吗?我只想设置电子邮件输入的值,就是这样!我想设置这个值,我想让 react.js 识别这个值。
jmingov 我研究了您提供的链接,但没有运气。我一整天都在研究这个,但我仍然无法以 react.js 更新值的方式触发 change 事件。 这个答案只涵盖了 OP 和我已经知道的内容。它并没有解决访问“虚拟dom”值并改变它的问题。【参考方案7】:

您应该发布您的代码以获得更好/更适合您的情况的答案,但一个认为可行的方法就是设置

defaultValue

而不是value 的输入。看看你的浏览器控制台,这就是 react 将在那里记录的内容。

根据您的代码,您可以使用函数设置 states value onKeyUp 或类似的函数,或者在提交表单时获取新的输入值。

【讨论】:

感谢@michael。很抱歉没有发布代码,但我不是那个网站的人,我只是添加了一些功能,代码是一团糟。但是看,我尝试了你的建议,但它不起作用 -> document.getElementById("CntctFrm2emailField").defaultValue = "testing@gmail.com"; .我认为出于某种原因我需要触发该输入的 onchange 事件,因为我认为 react.js 正在侦听 onchange 事件以更新内部值。我已经尝试过用 js 触发 onchange() 事件,但它也不起作用。也许有某种方法可以通过 react 触发更改事件? 谢谢!没有意识到这个道具存在。 @ArtemAliev 为什么不问另一个问题来解决您的具体问题,而不是在没有任何解释的情况下投票和抱怨?如您所见,此答案适用于数百人,因此您应该考虑到是您无法使其发挥作用,而不是答案...

以上是关于React.js 设置输入值的主要内容,如果未能解决你的问题,请参考以下文章

无法在 REACT.js 中输入和获取值

如何使用 React.JS 正确验证输入值?

React.js:将默认值设置为道具

从 React JS 中的输入字段获取值

如何在 React Js 中编辑输入值?

将值设置为状态 React js