首页 > 其他分享 >VUE|组件基础

VUE|组件基础

时间:2023-07-21 11:48:29浏览次数:29  
标签:VUE const 基础 vue TheCounter 组件 import ref

1 快速体验

步聚

  1. 定义组件
  2. 导入组件
  3. 引用组件

语法

<template>
  模板
</template>
<script setup>
  // 逻辑
</script>
<style>
/* 样式 */
</style>

1) 定义组件

components目录下, 创建组件文件TheCounter.vue

<template>
  <!-- 组件的模板部分 -->
  计数器:{{ count }}
  <button @click="handleClick">点击+1</button>
</template>

<script setup>
import { ref } from 'vue'

// 组件的逻辑部分
// 1. 在setup语法中定义变量, 可以直接在模板中使用
// 2. 在setup语法中定义函数, 可以直接在模板中使用
// 3. 导入的组件对象, 可以直接在模板中使用

const count = ref(0)
console.log(count)

function handleClick() {
  count.value++
}
</script>

<style>
/* 组件的样式 */
</style>

2) 导入组件

App.vue中, 通过import语法导入组件对象

<script setup>
// 2. 导入组件对象
import TheCounter from './components/TheCounter.vue'
</script>

3) 引用组件

App.vue的模板中, 通过组件名引用组件

<template>
  <!-- 3. 引用组件 -->
  <TheCounter></TheCounter>
</template>

4) 确定父子关系

在模板渲染时, 确定父子关系

2 父传子

父组件向子组件传递数据

  1. 在父组件中, 借助自定义属性
  2. 在子组件中, 通过defineProps接受

1) 静态绑定

示例

<template>
  <!-- 3. 引用组件 -->
  <TheCounter></TheCounter>

  <!-- 给组件传递参数
    1. 在父组件的模板中, 使用自定义属性
  -->
  <TheBlog title="01-vue"></TheBlog>
  <TheBlog title="02-gis"></TheBlog>
  <TheBlog title="03-js"></TheBlog>
</template>

<script setup>
// 2. 导入组件对象
import TheCounter from './components/TheCounter.vue'
import TheBlog from './components/TheBlog.vue'
</script>

在子组件中, 通过defineProps接收

<template>
  <div>{{ title }}</div>
</template>

<script setup>
// 通过defineProps()接受
const props = defineProps({
  // 属性名: {配置对象}
  title: {
    type: String,
    required: true,
  },
})
</script>

2) 动态绑定

<template>
  <!-- 3. 引用组件 -->
  <TheCounter></TheCounter>

  <!-- 给组件传递参数
    1. 在父组件的模板中, 使用自定义属性
  -->
  <TheBlog title="01-vue"></TheBlog>
  <TheBlog title="02-gis"></TheBlog>
  <!-- 将属性值和App组件中的一个状态动态绑定 -->
  <TheBlog :title="t"></TheBlog>
</template>

<script setup>
// 2. 导入组件对象
import TheCounter from './components/TheCounter.vue'
import TheBlog from './components/TheBlog.vue'
import { ref } from 'vue'

const t = ref('03-标题')
</script>

3 子传父

子组件向父组件传递数据

  1. 在子组件中, 触发自定义事件
  2. 在父组件中, 监听自定义事件, 在回调函数中通过参数获取

1) 关闭单个组件

定义事件

// 通过defineEmits()定义自定义事件
const emits = defineEmits(['close'])

绑定按钮点击事件

<template>
  <div>
    {{ title }}
    <button @click="handleClick">关闭</button>
  </div>
</template>
function handleClick() {
  emits('close')
}

完整示例

<template>
  <div>
    {{ title }}
    <button @click="handleClick">关闭</button>
  </div>
</template>

<script setup>
// 通过defineProps()接受
const props = defineProps({
  // 属性名: {配置对象}
  title: {
    type: String,
    required: true,
  },
})
// 通过defineEmits()定义自定义事件
const emits = defineEmits(['close'])

function handleClick() {
  // 触发自定义事件
  emits('close')
}
</script>

监听自定义事件

在父组件中监听事件

<template>
  <!-- 3. 引用组件 -->
  <TheCounter></TheCounter>

  <!-- 给组件传递参数
  1. 在父组件的模板中, 使用自定义属性
  -->
  <TheBlog title="01-vue" @close="handleClose" v-if="flag"></TheBlog>
  <TheBlog title="02-gis"></TheBlog>
  <!-- 将属性值和App组件中的一个状态动态绑定 -->
  <TheBlog :title="t"></TheBlog>
</template>
<script setup>
// 2. 导入组件对象
import TheCounter from './components/TheCounter.vue'
import TheBlog from './components/TheBlog.vue'
import { ref } from 'vue'

const t = ref('03-标题')
// 通过flag状态控制显示和隐藏
const flag = ref(true)

function handleClose() {
  flag.value = false
}
</script>

完整示例

<template>
  <!-- 3. 引用组件 -->
  <TheCounter></TheCounter>

  <!-- 给组件传递参数
    1. 在父组件的模板中, 使用自定义属性
  -->
  <TheBlog title="01-vue" @close="handleClose" v-if="flag"></TheBlog>
  <TheBlog title="02-gis"></TheBlog>
  <!-- 将属性值和App组件中的一个状态动态绑定 -->
  <TheBlog :title="t"></TheBlog>
</template>

<script setup>
// 2. 导入组件对象
import TheCounter from './components/TheCounter.vue'
import TheBlog from './components/TheBlog.vue'
import { ref } from 'vue'

const t = ref('03-标题')
const flag = ref(true)

function handleClose() {
  flag.value = false
}
</script>

2) 根据id关闭指定组件

示例

<template>
  <div>
    {{ title }}
    <button @click="handleClick">关闭</button>
  </div>
</template>

<script setup>
// 通过defineProps()接受
const props = defineProps({
  // 属性名: {配置对象}
  title: {
    type: String,
    required: true,
  },
  id: {
    type: Number,
    required: true,
  },
})
// 通过defineEmits()定义自定义事件
const emits = defineEmits(['close'])

function handleClick() {
  emits('close', props.id)
}
</script>
<template>
  <!-- 3. 引用组件 -->
  <TheCounter></TheCounter>

  <!-- v-if和v-for不能应用于同一个元素 -->
  <TheBlog
    v-for="blog in showBlogs"
    :key="blog.id"
    :title="blog.title"
    :id="blog.id"
    @close="handleClose"
  ></TheBlog>
</template>

<script setup>
// 2. 导入组件对象
import TheCounter from './components/TheCounter.vue'
import TheBlog from './components/TheBlog.vue'
import { ref, computed } from 'vue'

// 定义数据
const blogs = ref([
  { id: 1, title: '01-vue', isShow: true },
  { id: 2, title: '02-gis', isShow: true },
  { id: 3, title: '03-mapbox', isShow: true },
])

// 定义计算属性
const showBlogs = computed(() => {
  return blogs.value.filter((item) => item.isShow)
})
function handleClose(id) {
  console.log(id)
  // 根据id查找
  const blog = blogs.value.find((item) => item.id == id)

  blog.isShow = false
}
</script>

4 provide和inject

属性组件间通信, 传递数组的一种方式

  • provide: 提供. 数据由祖先组件提供
  • inject: 注入. 由后代组件获取数据

多应用于处理全局变量

示例

app应用实例上挂载

const app = createApp(App)
// 通过app定义全局的对象: $map
app.provide('$map', { map: 'world' })

app对应的子组件中, 可以直接引用

import { inject } from 'vue'

const map = inject('$map')
console.log(map)

5 插槽

1) 为什么需要插槽

组件的执行过程

编译组件的模板, 替换组件的引用

img

要组件内部写的内容不会被渲染出来.

但是, 很多时候需要扩展组件的功能

  1. 在组件中预留一个slot插槽
  2. 在组件渲染时, 将内容插入slot

2) 常用的插槽

普通插槽

在子组件定时时, 预留插槽

<template>
  <!-- 预留一个slot插槽 -->
  <slot></slot>
</template>

<script setup></script>

<style scoped></style>

在渲染子组件时, 会使用组件内部的内容替换掉slot部分

<TheComputer>
  <div>
    <h3>名称: MacBookPro</h3>
    <p>型号: MBP 14 M1</p>
  </div>
</TheComputer>

普通插槽

在定义slot插槽时, 设置name属性

<template>
  <!-- 预留一个slot普通插槽(默认插槽) -->
  <slot></slot>
  <!--  具名插槽 -->
  <slot name="cpu"></slot>
  <slot name="memery"></slot>
</template>

<script setup></script>

<style scoped></style>

在渲染时, 通过v-slot指令指定插槽的名称

<TheComputer>
  <template v-slot:cpu>
    <!-- 这里的内容插入到名字叫cpu的插槽中 -->
    CPU: M1 Pro
  </template>
  <template v-slot:memery> Memery: 16G </template>
</TheComputer

标签:VUE,const,基础,vue,TheCounter,组件,import,ref
From: https://www.cnblogs.com/tangjielin/p/17559998.html

相关文章

  • VUE|组合式API
    VUE|组合式API1setup语法糖在vue项目中,通常使用setup语法简化书写setup的特点在setup语法中定义变量,可以直接在模板中使用在setup语法中定义函数,可以直接在模板中使用导入的组件对象,可以直接在模板中使用常用的组合式APIrefcomputedwatchonMounted2ref......
  • VUE|侦听器
    1侦听器1)什么是侦听器可以通过watch配置项,监听已经存在的属性的改变2)语法watch:{//监听data中的firstName属性firstName(){//执行一系列的操作},},watch:{//监听data中的firstName属性firstName(){//执行一系列的操作},},示例......
  • 第十五篇 - Vue添加图标
    参考链接:https://www.yii666.com/blog/45780.html添加图标的两种方式:1.直接使用element-plus/icons-vue(图标名称网址:https://element-plus.gitee.io/en-US/component/icon.html#icon-collection)2.使用svg-sprite-loader自己下载svg图标(SVG图标下载网址:https://www.iconfinder......
  • Vue3 响应式全局对象json 动态绑定界面一 (列表样式)
    效果 man.js  定义响应式全局对象 globalDataconstglobalData=reactive({extTelListData:[{userExten:"1000",userName:"秦岚",callStatus:"通话"},{u......
  • 频谱仪基础(二)--- 超外差频谱分析仪实现
    在上一篇文章中,已经对频谱仪的基本原理进行了阐述。在下面的一节中,给出基于超外差原理的频谱分析仪的组件,并且已9kHz~3GHz/7GHz频谱仪设计构架作为现代频谱分析仪的实际实现分析。频谱仪是一个由各个重要的组件构成复杂的系统,包括RF、IF、低频、数据采集和处理显示部分,同时包括必......
  • 频谱仪基础(一)--- 频谱仪的架构
    前言无线电通信中最常见的测量任务之一是测试信号的频域特性。因此频谱分析仪作为更广泛和更宽的RF测量工具,其覆盖频率范围高达40GHz及以上,频谱分析测量,几乎可以用于所有无线应用开发、生产、安装和有线通信维护工作。随着移动通信的发展,一些主要关键指标,例如显示的平均噪声电......
  • 频谱仪基础(三)--- RF前端处理
     在频谱仪基础(二)讲述了高低中频的选择,对于9kHz到7GHz信号前端处理,我们需要分段进行处理,9kHz到3GHz信号采用高中频的方式,3GHz到7GHz采用低中频的方式直接将信号频谱搬移到低中频。1.9kHz到3GHz信号前端处理在图1所示中,第一个IF设置为3476.4MHz。将输入频率范围从9kHz到3GHz的输......
  • Unity UGUI的VerticalLayoutGroup(垂直布局)组件的介绍及使用
    UnityUGUI的VerticalLayoutGroup(垂直布局)组件的介绍及使用1.什么是VerticalLayoutGroup组件?VerticalLayoutGroup是UnityUGUI中的一种布局组件,用于在垂直方向上自动排列子对象。它可以根据子对象的大小和布局设置,自动调整子对象的位置和大小,实现垂直布局效果。2.VerticalLay......
  • Unity UGUI的VerticalLayoutGroup(垂直布局)组件的介绍及使用
    UnityUGUI的VerticalLayoutGroup(垂直布局)组件的介绍及使用1.什么是VerticalLayoutGroup组件?VerticalLayoutGroup是UnityUGUI中的一种布局组件,用于在垂直方向上自动排列子对象。它可以根据子对象的大小和布局设置,自动调整子对象的位置和大小,实现垂直布局效果。2.VerticalLayo......
  • 在Vue3中,解决 Echart tooltip 不显示的问题
    为什么在Vue中使用ECharts时图表显示异常?Vue3,中使用reactive及ref会导致ECharts的对象实例被代理成为响应式对象,影响ECharts对内部属性的访问,可能会导致图表无法正确显示等一系列意外问题,且会由于深度监听而极大地降低图表展示性能。解决方案为:使用普通变量声明ECh......