常见的5种Vue组件通信方式总结量const和var有什么区别详解行文本溢出

教程下载地址: 网赚博客https://www.piaodoo.com/创业项目排行榜前十名https://www.piaodoo.com/


一、const和var的区别

在 JavaScript 中,const 和 var 是用来定义变量的关键字,它们有以下主要区别:

  • 变量的作用域:
  • const:定义一个常量,常量是指一旦声明就不能再被重新赋值。常量的作用域可以是全局或块级作用域(在 {} 内声明)。
  • var:定义一个变量,变量的作用域可以是全局或函数作用域(在函数内部声明)。
  • 变量的重复声明:
  • const:不允许重复声明同名的常量,如果尝试重复声明会导致语法错误。
  • var:允许重复声明同名的变量,这可能会引发一些意外的问题。
  • 变量提升(Hoisting):
  • const:在块级作用域中使用 const 声明的常量不会被提升。在声明之前访问常量会导致暂时性死区(Temporal Dead Zone,TDZ)错误。
  • var:使用 var 声明的变量会被提升到其作用域的顶部,可以在声明之前访问,但是其值会是 undefined。
  • 变量赋值:
  • const:一旦用 const 声明了一个变量,并给它赋予了初始值,就不能再更改该变量的值。
  • var:变量可以在任何时候重新赋值,没有限制。

推荐的做法是尽量使用 const 来声明常量,这样可以确保代码中的常量值不会被意外改变,增加代码的可维护性和可读性。只有当你确定需要在后续代码中重新赋值的时候,才使用 var 来声明变量。另外,ES6(ECMAScript 2015)之后还引入了 let 关键字,它也可以用来声明块级作用域的变量,而且不会有变量提升和暂时性死区的问题,推荐在需要重新赋值的情况下使用 let。

二、let

let 是 JavaScript 中用于声明变量的关键字。它是在 ECMAScript 6(ES6)标准中引入的,提供了块级作用域的变量声明。

与 var 相比,let 具有以下特点:

  • 块级作用域:使用 let 声明的变量具有块级作用域。这意味着在 {} 内部声明的变量只在该块内部有效,并且在外部是不可访问的。

  • 变量提升和暂时性死区:与 var 不同,使用 let 声明的变量不会在块级作用域内被提升。在变量声明之前的区域称为 “暂时性死区”(Temporal Dead Zone,TDZ),在这个区域内访问变量会导致引用错误。

  • 重复声明:与 var 不同,let 不允许在同一个作用域内重复声明同名变量。如果尝试重复声明同名变量,会导致语法错误。

使用 let 声明变量是推荐的做法,因为它更符合现代 JavaScript 中的作用域规则,可以避免一些常见的问题,例如由于变量提升导致的意外行为。

三、 JavaScript 中定义全局变量的方式

在 JavaScript 中,可以使用以下几种方式来定义全局变量:

  • 使用 var 声明在全局作用域下定义变量(不推荐):
var globalVariable = 'This is a global variable';

但是,由于 var 声明的变量存在变量提升的问题,可能会导致意外的行为,因此在现代 JavaScript 中,不推荐使用 var 来定义全局变量。

  • 使用 let 或 const 在全局作用域下定义变量(推荐):
let globalVariable = 'This is a global variable';
const anotherGlobalVariable = 'This is another global variable';

通过使用 let 或 const 声明变量,可以确保变量在全局作用域下,同时避免了 var 的变量提升问题。

  • 在浏览器中,直接将变量声明在全局作用域下(不推荐):
<script>
  var globalVariable = 'This is a global variable';
</script>

虽然这种方法也可以定义全局变量,但是直接在全局作用域下声明变量会增加代码的耦合性,不利于代码维护和可读性,因此不推荐使用这种方式。

推荐使用第二种方式,使用 let 或 const 来定义全局变量。同时,要注意不要滥用全局变量,因为全局变量的过多使用可能导致命名冲突、不可预测的行为和难以维护的代码。在实际开发中,尽可能将变量限制在更小的作用域内,以避免全局命名空间污染。

教程下载地址: 网赚博客https://www.piaodoo.com/创业项目排行榜前十名https://www.piaodoo.com/

引言

在 Vue.js 中,组件通信是开发过程中非常重要的一部分,它涉及到不同组件之间的数据传递和交互。本文将介绍如何实现父子组件之间的有效通信,包括 Props、双向绑定、ref、以及 provide/inject 这几种常见的组件通信方式。

1. 父子通信(Props)

在 Vue.js 中,父子组件通信的最基本方式是通过 Props。父组件可以向子组件传递数据或方法,子组件通过 props 接收这些数据,从而实现父子组件之间的通信。

父组件:

<!-- Parent.vue -->
<template>
  <div class="hd">
    <input type="text" name="" id="" v-model="msg">
    <button @click="add">添加 </button>
  </div>
  <Child :list="list" />
</template>

<script setup>
import { ref } from ‘vue’
import Child from ‘./components/Child.vue’
const list = ref([‘html’, ‘css’])

const msg = ref(‘’)

const add = () => {
list.value.push(msg.value)

}
</script>

子组件:

<!-- Child.vue -->
<template>
    <div class="bd">
        <ul>
            <li v-for="item in list">{{ item }}</li>
        </ul>
    </div>
</template>

<script setup>

import { defineProps } from ‘vue’;
defineProps({
list: {
type: Array,
default: () => []
}
})
</script>

父子通信(Props)的优点和缺点如下:

优点:

  • 简单易懂:  Props 是 Vue.js 中最基本的组件通信方式之一,使用简单直观,易于理解和上手。

  • 单向数据流:  父组件通过 Props 向子组件传递数据,这种单向数据流使得数据变化的来源清晰明了,便于追踪和调试。

  • 组件解耦:  使用 Props 可以让组件之间保持相对独立,提高了组件的可复用性和可维护性。

缺点:

  • 层级限制:  Props 是父子组件之间的通信方式,当组件层级较深时,需要逐层传递 Props,增加了组件间的耦合性。

  • 大规模应用复杂性:  在大型应用中,如果组件关系错综复杂,过多的 Props 传递会导致代码不够清晰,维护起来较为困难。

  • 数据冗余:  有时为了满足一个子组件的特定需求,需要在父组件中传递较多的数据,可能会导致数据冗余或不必要的传递。

2. 子父通信($emit)

子组件可以使用 $emit 方法发布一个事件,父组件可以通过监听这个事件来订阅,从而实现子父组件之间的通信。

子组件:

<!-- Child.vue -->
<template>
    <div class="hd">
        <input type="text" name="" id="" v-model="msg">
        <button @click="add">添加</button>
    </div>

</template>

<script setup>
import { ref } from ‘vue’;

const msg = ref(‘’)
const emits = defineEmits([‘add’]) //创建一个add事件

const add = () => {
emits(‘add’, msg.value);
console.log(msg.value);
msg.value = ‘’;
}

</script>

父组件:

<!-- Parent.vue -->
<template>
    <Child @add="handle" />
&lt;div class="bd"&gt;
    &lt;ul&gt;
        &lt;li v-for="item in list"&gt;{{ item }}&lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;

</template>

<script setup>
import { ref } from ‘vue’;
import Child from ‘./components/Child.vue’

const list = ref([‘html’, ‘css’])

const handle = (e) => {
list.value.push(e)
}
</script>

子父通信($emit)的优点和缺点如下:

优点:

  • 灵活性:  使用 $emit 实现子父通信可以非常灵活地传递数据和消息,子组件可以向父组件传递任意类型的数据。

  • 解耦合:  子组件通过 $emit 触发事件,父组件监听事件,实现了组件之间的解耦合,提高了组件的独立性和复用性。

  • 响应式:  通过 $emit 传递的数据在父组件中是响应式的,可以实时更新视图,提高了用户体验。

缺点:

  • 事件命名冲突:  如果项目较大或组件较多,可能会出现事件命名冲突的情况,需要谨慎管理事件名称。

  • 跨级通信复杂性:  当组件层级较深时,子组件向父组件传递数据可能需要经过多层中间组件,增加了通信的复杂性。

  • 不适用于兄弟组件通信:  $emit 主要用于子组件向父组件传递数据,对于兄弟组件之间的通信并不直接适用,需要借助其他方式实现。

3. 子父通信(双向绑定)

子组件可以通过 $emit 方法将修改后的数据发送给父组件,父组件可以通过 v-model 在子组件上实现双向绑定,实现父子组件之间数据的双向同步。

父组件:

<!-- Parent.vue -->
<template>
    <Child v-model:list="list" />
&lt;div class="bd"&gt;
    &lt;ul&gt;
        &lt;li v-for="item in list"&gt;{{ item }}&lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;

</template>

<script setup>
import { ref } from ‘vue’;
import Child from ‘./components/Child.vue’

const list = ref([‘html’, ‘css’])

</script>

子组件:

<!-- Child.vue -->
<template>
    <div class="hd">
        <input type="text" name="" id="" v-model="msg">
        <button @click="add">添加</button>
    </div>

</template>

<script setup>
import { ref } from ‘vue’;

const msg = ref(‘’)
const props = defineProps({
list: {
type: Array,
default: () => []
}
})

const emits = defineEmits([‘update:list’])

const add = () => {
const arr = props.list
arr.push(msg.value)
emits(‘update:list’, arr)
msg.value = ‘’
}

</script>

子父通信(双向绑定)

优点:

  • 数据同步:  使用双向绑定可以实现数据的双向同步,子组件修改数据后可以直接影响到父组件中的数据,反之亦然。

  • 简洁明了:  双向绑定让数据流动更加清晰明了,减少了手动管理数据的复杂性。

  • 提高开发效率:  在某些场景下,双向绑定可以减少编写大量的事件监听和触发逻辑,提高开发效率。

缺点:

  • 数据流不清晰:  在复杂的组件结构中,双向绑定可能使得数据流变得不够清晰,增加调试和维护的难度。

  • 难以追踪:  当数据在组件之间频繁传递和修改时,可能会难以追踪数据的变化来源,导致代码的可读性降低。

  • 潜在的性能问题:  双向绑定会引起数据的频繁更新和DOM重新渲染,可能会对性能产生一定的影响,特别是在大型应用中。

4. 子父通信(ref)

子组件可以使用 defineExpose 暴露需要共享的值,父组件可以利用 ref 读取整个子组件对象来获取暴露的值。

父组件:

  • 获取子组件实例:  通过在子组件标签上添加 ref 属性,可以在父组件中来访问子组件的实例。
  • 直接操作子组件:  父组件可以通过 ref 获取子组件的实例,然后直接调用子组件的方法或访问子组件的数据,实现父组件对子组件的控制和操作。
<!-- Parent.vue -->
<template>
    <Child ref="childRef" />
    <div class="bd">
        <ul>
            <li v-for="item in childRef?.list">{{ item }}</li>
        </ul>
    </div>
</template>

<script setup>
import { onMounted, ref } from ‘vue’;
import Child from ‘./components/Child_4.vue’

const childRef = ref(null)

</script>

子组件:

  • 提供给父组件访问的接口:  子组件可以通过 ref 方法提供自身的实例给父组件,使得父组件可以直接操作子组件。
<!-- Child.vue -->
<template>
    <div class="hd">
        <input type="text" name="" id="" v-model="msg">
        <button @click="add">添加</button>
    </div>

</template>

<script setup>
import { ref } from ‘vue’;

const list = ref([‘html’, ‘css’])
const msg = ref(‘’)

const add = () => {
list.value.push(msg.value)
msg.value = ‘’
}

defineExpose({ list }) //子组件暴露出去的数据

</script>

子父通信(ref)优点和缺点

优点:

  • 直接访问子组件:  使用 ref 可以直接在父组件中引用和操作子组件的实例,方便进行数据传递、调用子组件方法等。

  • 灵活性:  ref 提供了一种灵活的方式来处理子组件的数据和逻辑,可以根据具体需求自由地操作子组件。

  • 适用范围广泛:  ref 不仅可以用于访问子组件,还可以用于访问 DOM 元素或其他 Vue 实例,具有较强的通用性。

缺点:

  • 耦合性增加:  直接在父组件中操作子组件的实例可能会增加组件之间的耦合性,降低了组件的独立性和复用性。

  • 不符合单向数据流原则:  使用 ref 可能打破 Vue.js 单向数据流的原则,使得数据流变得不够清晰,增加了代码的复杂性。

5. 父子组件通信(provide/inject)

父组件可以通过 provide 提供数据或方法,子组件可以通过 inject 注入所需的数据或方法,实现父子组件之间的通信。

父组件:

  • 使用 provide 来提供数据,这些数据将会被后代组件的 inject 所接收。
<!-- Parent.vue -->
<template>
    <div class="hd">
        <input type="text" name="" id="" v-model="msg">
        <button @click="add">添加</button>
    </div>
    <Child />
</template>

<script setup>
import { ref, provide } from ‘vue’;
import Child from ‘./components/Child5.vue’

const msg = ref(‘’)
const list = ref([‘html’, ‘css’])

provide(‘list’, list.value)

const add = () => {
list.value.push(msg.value)
}
</script>

子组件:

  • 通过 inject 选项指定需要注入的数据,可以从父组件中接收到共享的数据。
<!-- Child.vue -->
<template>
    <div class="bd">
        <ul>
            <li v-for="item in list">{{ item }}</li>
        </ul>
        <Child5 />
    </div>
</template>

<script setup>
import { ref, inject } from ‘vue’;

const list = inject(‘list’);
</script>

父子组件通信(provide/inject)优点和缺点:

优点:

  • 跨层级通信:  provide/inject 可以方便地实现祖先组件向后代组件的数据传递,解决了跨层级通信问题。

  • 灵活性:  provide/inject 不限制数据的传递方式,提供了一种灵活的组件通信机制。

  • 减少嵌套组件的复杂性:  在多层嵌套的组件结构中,provide/inject 可以简化数据传递流程,减少了 props 的层层传递。

缺点:

  • 耦合性增加:  使用 provide/inject 可能会增加组件之间的耦合性,降低了组件的独立性和复用性。

  • 可读性较差:  在子组件中使用 inject 注入的数据需要在组件选项中指定,可读性相对较差,不如 props 直观。

以上就是常见的5种Vue组件通信方式总结的详细内容,更多关于Vue组件通信方式的资料请关注网赚博客https://www.piaodoo.com/其它相关文章!

                        友情连接:  

茂名一技http://www.szsyby.net/


茂名一技http://www.enechn.com/


美文集http://www.tpyjn.cn/


手游排行前十名http://www.bjkhrx.com/


蔚来汽车http://www.weilaiqiche.cn/

总结

到此这篇关于javascript中定义变量const和var有什么区别的文章就介绍到这了,更多相关js定义变量const和var区别内容请搜索网赚博客https://www.piaodoo.com/以前的文章或继续浏览下面的相关文章希望大家以后多多支持网赚博客https://www.piaodoo.com/!

                        友情连接:  

茂名一技http://www.szsyby.net/


茂名一技http://www.enechn.com/


美文集http://www.tpyjn.cn/


手游排行前十名http://www.bjkhrx.com/


蔚来汽车http://www.weilaiqiche.cn/

  • 27
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值