【问题标题】:Modify React Component's State using jQuery/Plain Javascript from Chrome Extension使用 Chrome 扩展中的 jQuery/Plain Javascript 修改 React 组件的状态
【发布时间】:2017-05-01 03:57:13
【问题描述】:

我正在构建一个小型 Chrome 扩展程序供我个人使用。

在 Facebook 的广告管理器(使用 React)中,我想将 textarea 字段的值更改为我的 chrome 扩展生成的值。

我尝试过像这样的老式方式

document.querySelector('textarea').value = myValue;

这会改变屏幕上的值,但在 chrome 的检查元素中,值不会改变,当我专注于输入元素时,值会重置。

这是 react 组件的样子:

这是这个反应组件道具和状态的图片:

在上面的组件中,我想将 state.displayValue 更改为我的值。

怎么做?

【问题讨论】:

  • 我现在正在处理类似的任务,您找到解决方案了吗?
  • 有什么解决办法吗?
  • 嘿@Santhos,如果它仍然是实际的,看看我的答案

标签: javascript jquery reactjs


【解决方案1】:

如前所述,您需要将手动更改通知 react。然而,对于 React 16,这是not so straightforward

const element = document.querySelector('textarea')
const event = new Event('input', { bubbles: true })
const previousValue = element.value

element.value = 'next value'
element._valueTracker.setValue(previousValue)
element.dispatchEvent(event)

这是一个有效的codesandbox 源代码。
要仅查看演示,您可以直接从浏览器开发工具控制台打开 this link 并调用 window.triggerChange('new value') 函数。

您将看到 React 的 onChangesetState 事件被触发! ?

【讨论】:

  • 我刚刚在这个 React 页面上的电子邮件字段 document.querySelector('[type=email]') 上尝试了这个:seatgeek.com/cowboys,但什么也没发生
  • @AymonFournier 嗯,我尝试使用此选择器 document.querySelector('div.ghosted-input__field__main > input') 并按预期执行脚本 - 电子邮件字段值已更新,提交表单包括更新的电子邮件。选择器来自 Chrome 开发工具,修剪到最后几个条目
  • 这里是一个使用全长选择器imgur.com/a/4MM3jc2 的示例,一旦输入值被更改 - 进一步的脚本应该可以正常工作
  • 任何使用选择框的人都可以试试这个:element.value = 'somevalue'; element.dispatchEvent(new Event('change'));
  • 在我的情况下,我必须使用 input 事件作为 textareas 和 blur 输入
【解决方案2】:

@Bandal react 需要通知输入值已更改。更新值后,您需要发送一个更改事件。

    document.querySelector('textarea').value = myValue;
    const event = new Event('input', { bubbles: true })
    document.querySelector('textarea').dispatchEvent(event)

原答案here

【讨论】:

    猜你喜欢
    • 2020-09-20
    • 2011-12-22
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2018-10-15
    相关资源
    最近更新 更多