当前位置: 首页 > 知识库问答 >
问题:

vue.js - Vue手写渲染函数,为何不能使用已经观测的数据作为data?

云丰
2023-07-18
new Vue({    data: {        lists: {}    },    render(h) {        return h('div', this.lists)    }}).$mount()

如题所述,上述代码报错如下。

vue-2.0.0.js:2586 [Vue warn]: Avoid using observed data object as vnode data: {}
Always create fresh vnode data objects in each render! (found in root instance)

共有2个答案

全弘深
2023-07-18
new Vue({  data: {    lists: {}  },  render(h) {    //创建一个新的 vnode 数据对象,并复制 this.lists 的属性到新对象中        //不要重复使用相同的数据对象    const vnodeData = Object.assign({}, this.lists);    return h('div', vnodeData);  }}).$mount();

官网上的渲染函数章节指出: 组件树中的所有 VNode 必须是唯一的,
你在data里的声明的lists作为一个VNode数据,又在渲染函数里再次使用它作为VNode数据了。
在 Vue中,每个组件的渲染过程都会生成一个虚拟 DOM (vnode) 树,用于描述组件的结构和状态。在渲染过程中,Vue会比较前后两个 vnode 树的差异,并只更新需要更新的部分,以提高性能。
在多次渲染中重复使用相同的数据对象作为 vnode 数据时,Vue.js 会难以确定数据对象是否发生了变化。因为 Vue会跟踪被观察的数据对象的变化,如果相同的数据对象在不同的渲染中被重复使用,Vue可能会错误地认为数据没有变化,从而导致无法正确更新组件。
为了解决这个问题,Vue强制要求在每次渲染时都创建新的 vnode 数据对象。这样,Vue可以准确地追踪数据对象的变化,并根据变化情况来更新组件。

华恩
2023-07-18
new Vue({    data: {        lists: {}    },    render(h) {        return h('div', { props: this.lists })    }}).$mount()
 类似资料:
  • 1. 简介 本小节我们将介绍 Vue 渲染函数。包括什么是渲染函数、虚拟 DOM、如何编写渲染函数。渲染函数是一个难点,通常在一些简单的项目中不会使用,在处理一些复杂的业务场景时,使用渲染函数往往可以达到事半功倍的效果。 通过本小节的学习我们可以掌握渲染函数的基本用法,如果同学们学完本小节之后对此还不是特别熟悉也没有关系,我们可以先将基础知识融会贯通,然后再对该知识点多加练习,相信同学们一定可以熟

  • 本文向大家介绍Vue渲染函数详解,包括了Vue渲染函数详解的使用技巧和注意事项,需要的朋友参考一下 前面的话 Vue 推荐在绝大多数情况下使用 template 来创建HTML。然而在一些场景中,真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更接近编译器。本文将详细介绍Vue渲染函数 引入 下面是一个例子,如果要实现类似下面的效果。其中,H标

  • 我尝试运行一个简单的Vue.js,但我经常收到以下错误: [Vue警告]:您似乎在内容安全策略禁止不安全评估的环境中使用Vue.js的独立构建。模板编译器无法在此环境中工作。考虑放宽策略以允许不安全评估或将模板预编译为呈现函数。 主要的js:3180[Vue warn]:未能生成呈现函数:EvalError:拒绝将字符串计算为JavaScript,因为“不安全的eval”不是以下内容安全策略指令中

  • 本文向大家介绍写给vue新手们的vue渲染页面教程,包括了写给vue新手们的vue渲染页面教程的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要给各位vue的新手们分享了关于vue渲染页面的教程,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 vue渲染页面 路径图 index.html App.vue router.js main.js 效果图: 总结 以上就是这篇文章的

  • 最近使用 vscode 进行 vue 开发时根据提示把 volar 卸载了,使用了新的 vue-official vscode 插件。但是发现如果在 vue 文件开发时,无法触发参数提示,即使通过快捷键的方式也无法触发函数的参数提示。而在普通的 ts 文件上没有问题。 上面是正常的,下面是在 vue 文件中无法触发参数提示。 vscode 版本是 1.87.1 Vue - Official 版本是

  • 使用scandir()函数时,我收到以下php警告: Scandir无法打开目录:公共html/page2中不允许操作。php在线3 第2页。php 我想使用这个功能来打印我的根文件夹的文件和子目录,但它不工作。 有人知道怎么修吗?