首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如果文本节点是在DOM中手动编辑的,那么如何强制它更新文本节点呢?

如果文本节点是在DOM中手动编辑的,那么如何强制它更新文本节点呢?
EN

Stack Overflow用户
提问于 2020-03-30 03:53:36
回答 3查看 939关注 0票数 0

我有一个在DOM中手动编辑的文本节点,当调用render()方法时,该节点不会被React更新。

使用官方React网站中的示例演示

代码语言:javascript
运行
AI代码解释
复制
class TodoApp extends React.Component {
  constructor(props) {
    super(props);
    this.state = { items: [], text: '' };
    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  render() {
    return (
      <div>
        <h3>TODO</h3>
        <TodoList items={this.state.items} />
        <form onSubmit={this.handleSubmit}>
          <label htmlFor="new-todo">
            What needs to be done?
          </label>
          <input
            id="new-todo"
            onChange={this.handleChange}
            value={this.state.text}
          />
          <button>
            Add #{this.state.items.length + 1}
          </button>
        </form>
      </div>
    );
  }

  handleChange(e) {
    this.setState({ text: e.target.value });
  }

  handleSubmit(e) {
    e.preventDefault();
    if (this.state.text.length === 0) {
      return;
    }
    const newItem = {
      text: this.state.text,
      id: Date.now()
    };
    this.setState(state => ({
      items: state.items.concat(newItem),
      text: ''
    }));
  }
}

class TodoList extends React.Component {
  render() {
    return (
      <ul>
        {/* Note: using contentEditable only for the purpose of this demo */}
        {this.props.items.map(item => (
          <li key={item.id} contentEditable={true}>{item.text}</li>
        ))}
      </ul>
    );
  }
}

ReactDOM.render(
  <TodoApp />,
  document.getElementById('todos-example')
);
代码语言:javascript
运行
AI代码解释
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="todos-example"></div>

我只为这个演示添加了contentEditable (我没有试图更新todo项),当您添加一个新项,然后在DOM中直接编辑它,然后添加另一个项,为什么之前编辑的项没有被更新到它以前的状态?

编辑:

为什么要这样做?我有一个应用程序,用户可以点击编辑按钮并开始直接编辑文本,我添加contentEditable属性并使用onInput存储已编辑的文本,并使用传递的函数更新父级的状态,我想解决的是当用户取消编辑时,我想恢复以前的文本,我目前正在做的是直接编辑该元素的innerText,以设置以前的值,因为它没有被React更新。

EN

回答 3

Stack Overflow用户

发布于 2020-03-30 04:04:03

您有这个问题,因为React有一个虚拟DOM,它可以比较更改。当您修改真正的DOM时,React不知道您修改了它,所以当它将其虚拟DOM与新的render()进行比较时,不会看到该元素的任何更改,因此不会重新呈现。

如果您控制了所有反应组件中的HTML,不要直接修改DOM,永远不要。您应该在用户操作上添加事件侦听器(在本例中为keypress),以捕获它们并相应地更新组件状态。如果这样做,您必须了解反应虚拟DOM作品是如何实现的。

票数 1
EN

Stack Overflow用户

发布于 2020-03-30 04:04:35

如果stateprops保持不变,组件将不会重新呈现。因此,如果要重新呈现组件,则手动编辑必须更新某些状态。

所以,我相信你可以做同样的事情,但“反应方式”,而不是手动。其他人,使用反应有什么意义?

编辑

如果内容可编辑为“必须有”(您不能在div和文本区域之间切换),如果我是您-将添加:

  1. tempEdit to state或selected --如果需要将对象保存在状态的该部分中。如果选择对象,也可以在这里保留原始文本--如果用户选择取消编辑,则可以使用后者。
  2. 添加“取消”按钮以取消其
  3. 可选:如果具有内容可编辑的attr元素可以接受onBlur,请使用它恢复已编辑元素中的文本
票数 1
EN

Stack Overflow用户

发布于 2020-03-31 03:21:50

我使用key属性解决了这个问题,强制响应重新创建DOM元素,我不知道这是否是最好的方法,但这是我发现的最干净的方法,当用户在更改文本后取消编辑时,让我恢复contentEditable元素的文本。

我有一个edit状态属性,我切换该属性使元素可编辑,因此我添加了一个key,其中包含该属性的字符串值:

代码语言:javascript
运行
AI代码解释
复制
<p
  contentEditable={this.state.edit}
  suppressContentEditableWarning="true"
  onInput={this.handleInput}
  onKeyDown={this.handleKeyDown}
  key={String(this.state.edit)}
>
  {item.text}
</p>

这有一个缺点,React将在edit状态的每一次更改上重新创建元素。

最终,contentEditable并不是所有情况下的最佳解决方案,但是当您需要在不添加新元素的情况下提供编辑解决方案时,这可以完成任务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60929947

复制
相关文章
初探JavaScript(一)——也谈元素节点、属性节点、文本节点
  Javascript大行其道的时候,怎么能少了我来凑凑热闹^_^   基本上自己对于js的知识储备很少,先前有用过JQuery实现一些简单功能,要论起JS的前世今生,来龙去脉,我就一小白。抱起一本
JackieZheng
2018/01/08
2.5K0
初探JavaScript(一)——也谈元素节点、属性节点、文本节点
JavaScript 学习-33.HTML DOM 获取和修改文本节点
前言 textContent、innerText 和 innerHTML 三个方法的使用场景和区别 textContent 和 innerText IE 浏览器最早引入了innerText, 虽然是IE浏览器私有属性,但是其他很多浏览器也支持了。提到IE,必然是坑! 火狐浏览器把innerText换成了textContent , 但其他浏览器上面,也是可以使用textContent。 使用区别: textContent 用来设置或获取某个元素内所有文本内容,包含子元素内容,隐藏元素也能获取。 innerTe
上海-悠悠
2022/05/30
1.7K0
JavaScript 学习-33.HTML DOM 获取和修改文本节点
JavaScript 技术篇-js获取带空格的dom节点的text文本内容
我们用 innerText 获取到的文本信息是除掉空格的。但有时根据需求我们需要获取到完整的文本信息。 请看效果图:
小蓝枣
2020/09/23
5.5K0
HTML DOM 节点
我们常用父(parent)、子(child)和同胞(sibling)等术语来描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。
陈不成i
2021/07/21
1K0
如何使用Map处理Dom节点
我们在JavaScript中使用了很多普通的、古老的对象来存储键/值数据,它们处理的非常出色:
chuckQu
2023/09/01
1480
如何使用Map处理Dom节点
javaScript 原生DOM节点操作(最实用的dom节点操作大全)
注意:除了通过id选择节点的方式拿到的是一个确定的节点,其余的方式拿到的都会是一个数组,那么获取数组里面对应的节点需要用索引来取并且在Elements后面有s 例如:var body = document.ElementsByTagName("body")[0] ("fatherNode"表示父节点,"childNode"表示子节点)
憧憬博客
2020/07/20
2.1K0
如何在页面中监听“不存在”的 DOM 节点
MutationObserver 是用于监视 DOM 树内的特定节点的 Web API 接口,一旦监测到节点发生变化,就会通知回调函数执行相应的逻辑。该 API 的兼容性很好,但由于如今流行的 JS 框架都旨在“数据驱动视图”,使得这个 API 容易被大众遗忘。本文将介绍 MutationObserver 的基本原理、使用方法和应用场景,帮助读者更好地理解和应用这个灵活且强大的 API。
茶无味的一天
2023/04/14
1.4K0
xpath库详解xpath入门获取所有节点 //子节点 /父节点 ..属性匹配 @文本获取按序选择节点轴选择
python爬虫抓取网页内容,需要对html或xml结构的数据进行解析,如果用正则,单是写正则表达式就让很多望而生畏了。
章鱼喵
2018/09/26
25.5K0
xpath库详解xpath入门获取所有节点 //子节点 /父节点 ..属性匹配 @文本获取按序选择节点轴选择
JavaScript 技术篇-js只获取本节点text文本,不包含子节点
innerText 和 textContent 都是获取所有节点的 firstChild.nodeValue 是获取本节点的text文本,不包含子节点的。
小蓝枣
2020/09/25
6.4K0
JavaScript 技术篇-js只获取本节点text文本,不包含子节点
cdn节点选择的机制是什么?如何自己选择cdn节点呢?
在网络中目前分布着大量的cdn节点,这些节点能够有效的提升用户访问其他网站的速度,解决因为网络延迟而造成的访问速度慢、使用体验差等问题,那么cdn节点选择的机制是什么?如何自己选择cdn节点呢?
用户8715145
2021/09/18
3.3K0
cdn节点选择的机制是什么?如何自己选择cdn节点呢?
jQuery添加dom节点的方法
一、内部插入DOM: 完整示例1: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>jQuery添加dom节点方法一 -青梅博客</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script> </head> <body> <div class="box"> <span>青梅煮码</span> </div>
青梅煮码
2023/01/16
1.6K0
前端开发必备:Maps与WeakMaps在DOM节点管理中的妙用
这篇文章讨论了使用 Maps 和 WeakMaps 处理DOM节点的优势。Maps 和 WeakMaps 是非常实用的工具,尤其在处理大量DOM节点时,它们发挥着重要作用。
前端小智@大迁世界
2023/05/26
3520
前端开发必备:Maps与WeakMaps在DOM节点管理中的妙用
JavaScript DOM 节点的拷贝、删除
拷贝一个节点相当于将一个节点作为对象存放在内存中,这个对象可以被其他的诸如 appendChild 等操作来使用。而节点删除则只能通过一个 removeChild 来实现,所以要删除某个元素,首先要获取这个元素的父节点。我们使用以下方法来实现,参考代码:
我与梦想有个约会
2023/10/20
3140
获取DOM节点的方法汇总
我们都知道,当获得所有节点(如:getElementsByTagName)或者获得所有子元素(如:element.childNodes)时,实际上返回的是包含一些DOM节点的集合,这个集合要么是 HTMLCollection,要么是 NodeList,两者其实都是类数组的对象。
Chor
2019/11/07
4.3K0
JavaScript-DOM节点操作
在JavaScript中,如果想通过id来选中元素,我们可以使用document对象的getElementById()方法。
Qwe7
2022/04/09
4710
JavaScript HTML DOM 节点列表
一些旧版本浏览器中的方法(如:getElementsByClassName())返回的是 NodeList 对象,而不是 HTMLCollection 对象。
陈不成i
2021/07/20
1.8K0
《kafka问答100例 -4》 如果我手动在zk中添加/brokers/topics/{TopicName}节点会怎么样?
如果我手动在zk中添加`/brokers/topics/{TopicName}`节点会怎么样? 先说结论: 根据上面分析过的源码画出的时序图可以指定; 客户端发起创建Topic的请求,本质上是去z
石臻臻的杂货铺[同名公众号]
2021/12/31
4970
《kafka问答100例 -4》 如果我手动在zk中添加/brokers/topics/{TopicName}节点会怎么样?
js操作DOM在父元素中的结尾添加子节点注意
所以js是不能直接传入字符串的,但是jquery的append可以直接传入html字符串。
蓓蕾心晴
2018/10/25
10K0
js操作DOM在父元素中的结尾添加子节点注意
DOM 节点的克隆和导入
在使用 JS 操作 DOM 节点的时候,我们常常会用到克隆(或导入)节点的操作,那到底有哪些方法可以实现节点克隆(或导入)的效果呢?
编程三昧
2022/02/19
1K0
DOM 节点的克隆和导入
点击加载更多

相似问题

用文本覆盖旧文本更新DOM节点

12

如果某个特定节点是文本节点,如何使用Xpath选择它?

12

如何从DOM节点获取文本节点?

30

如何检索DOM文本节点的文本?

15

如果我知道节点是< id >,那么如何立即匹配它

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档