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

vue3 - Vue3 传值哪种会更好更快?

甘骞尧
2023-10-31

第一种方式:

App.vue

<script setup>import NavTree from "@/components/NavTree.vue";import {ref} from "vue";const ids = ref([1,2,3,4,5,6]);provide('ids', ids);// 这个 navs 有好几百个const navs = ref([    {        id: 1,        parent_id: 0,        name: '名称1',        children: [            {                id: 2,                parent_id: 1,                name: '名称2',                children: [                    // ...                ]            }        ]    }    // ...]);</script><template>    <NavTree :navs="navs" /></template>

NavTree.vue

<script setup>import {getCurrentInstance} from "vue";defineProps(['navs']);const {proxy} = getCurrentInstance();const nav_ids = proxy.$route.meta.nav_ids;const ids = inject('ids');</script><template>    <div v-for="(val, index) in navs" :key="index">        <p>{{val.name}} {{ids}} {{nav_ids}}</p>        <NavTree :navs="val.children" />    </div></template>



第二种方式:

App.vue

<script setup>import NavTree from "@/components/NavTree.vue";import {ref} from "vue";const ids = ref([1,2,3,4,5,6]);// 这个 navs 有好几百个const navs = ref([    {        id: 1,        parent_id: 0,        name: '名称1',        children: [            {                id: 2,                parent_id: 1,                name: '名称2',                children: [                    // ...                ]            }        ]    }    // ...]);</script><template>    <NavTree :navs="navs" :ids="ids" :nav_ids="$route.meta.nav_ids" /></template>

NavTree.vue

<script setup>defineProps(['navs', 'ids', 'nav_ids']);</script><template>    <div v-for="(val, index) in navs" :key="index">        <p>{{val.name}} {{ids}} {{nav_ids}}</p>        <NavTree :navs="val.children" :ids="ids" :nav_ids="nav_ids" />    </div></template>

上面这两个种 idsnav_ids 传值, 哪种传值会更快,还是说都一样,如果 navs 很多的时候

共有2个答案

冯皓
2023-10-31

速度,内部都是对组件实例属性的 get 操作,我认为是一样快的
优势,就是 inject 的使用范围肯定大于 prop的,但两者都局限于组件,不能脱离组件使用

万涵亮
2023-10-31

效率上基本没有区别

  • 全局属性props 本质上都对象,都是从对象上取值,不会产生效率上的差异
  • provide/inject 内部存储上下文状态的数据结构也是对象,无非是给你提供了两个方法来 getset,也就比直接从对象上取值多产生了一些函数执行的开销,而这些开销完全可以忽略不计

再说哪种好,技术没有好坏,无论是 props or provide/inject 都有与之对应的应用场景

  • props组件化 的开发模式下最基础的组件间传值方式
  • provide/inject 是为了解决 组件层级 太深时,通过 props 传值很麻烦的问题,但 弊端 是共享状态的方式太隐晦,组件的使用者无法通过 查看组件内部代码/或相关文档 以外的方式了解组件 provide 了什么,inject 了什么,也就是说 provide/inject 会让组件变得不纯,依赖不明确
  • store(vuex,pinia) 又是为了更好的管理状态而被提出的方案

所以,基于自己项目的体量选择合适的方式即可

 类似资料:
  • 关于vue3如何写hooks的问题? 如何限值list是ref值,亦或者即使传入的是普通值,也可以触发watch?还有就是这个hooks中的watch在使用了hooks之后一直存在吗,还是说组件销毁了watch就自动销毁,还是需要在这个hooks在写上组件卸载时手动销毁。 我记得antfu之前有个演讲提到过在hooks里用geter函数和tovalue、toref来提升兼容性,但是我记不清了,不知

  • 本文向大家介绍哪种PHP SOAP或NuSOAP更好?,包括了哪种PHP SOAP或NuSOAP更好?的使用技巧和注意事项,需要的朋友参考一下 PHP SOAP从PHP版本5.0.1开始可用。仍在使用PHP4的用户需要使用NuSOAP。 本地PHP代码在性能方面更好,并且相对而言没有错误。因此,建议使用PHP SOAP(如果可用)。 另一方面,NuSOAP在其官方网站上也没有太多文档。 NuSOA

  • 我是个初学者只是想找个更好的方法来解决问题 问题是,最佳实践是捕捉异常还是避免异常? 或

  • 描述:在父组件引入子组件,子组件是一个弹窗,两种方式都可实现,哪种写法更好,为什么? 方式1是在父组件定义控制子组件是否打开的参数以及传递的参数,在子组件进行监听赋值 方式2是用ref操作子组件方法 方式一: 方式二:

  • 需求,我的 vue3 中的 data=ref([]) 更新之后,我希望 echarts 的图标也跟着一起更新 但是目前不会,我该怎么修改

  • 问题内容: 使用哪种更好或更方便: 要么 问题答案: 您是否完全需要类型属性?如果您使用的是HTML5,则不会。否则,是的。HTML 4.01和XHTML 1.0 根据需要指定属性,而HTML5具有可选属性,默认为。HTML5现在得到了广泛的实现,因此,如果您使用HTML5doctype,则是有效且不错的选择。 至于type属性中应该包含的内容,2006年注册的MIME类型旨在替代所有主要浏览器(