【面试 · 一】vue大集合

目录

vue2

基础属性

组件通信

全局状态管理 vueX

路由

路由守卫

vue3

基础属性

组件通信

全局状态管理 Pinia

路由

路由守卫

vue2、vue3生命周期

setup

vue2

基础属性

data:用于定义组件的初始数据,必须是一个函数,返回一个对象,每个组件实例都会有自己的数据对象,避免组件之间数据相互影响。

props:用于接收父组件传递的数据,必须是一个数组或对象,数组中的每个元素是一个字符串,表示接收的属性名,对象中的每个属性表示接收的属性名和属性值的类型。

methods:用于定义组件的方法,每个方法都是一个函数,可以在组件中通过 this 访问。

watch:用于监听数据的变化,当数据发生变化时,执行相应的回调函数,可以监听单个数据或多个数据的变化。

computed:用于计算属性,根据已有的数据计算出新的数据,可以监听多个数据的变化,只有当依赖的数据发生变化时才会重新计算。

created:在实例创建完成后立即执行,可以在这个钩子函数中进行数据初始化、事件监听等操作。

computed计算属性

watch

基本使用

 watch: {name: { //这里是要监听的变量名handler(newValue, oldValue) { //这里的第一个参数是改变后的值,第二个参数是原来的值console.log('改后的值是:' + newValue)console.log('原来的值是:' + oldValue)}}}

简写

    watch: {name(newValue, oldValue) { //这里的第一个参数是改变后的值,第二个参数是原来的值console.log('改后的值是:' + newValue)console.log('原来的值是:' + oldValue)}}

immediate:就是当值第一次绑定时,不会执行监听函数,只有值发生改变时才会执行。如果我们需要在最初绑定值的时候也执行函数,需要用到immediate属性;

deep:当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,此时就需要deep属性对对象进行深度监听,数组字符串一般不需要。

  watch: {name: {handler(newValue, oldValue) {//这里的第一个参数是改变后的值,第二个参数是原来的值console.log('改后的值是:' + newValue)console.log('原来的值是:' + oldValue)},immediate: true,deep:true}}

组件通信

父传子

子传父

非父子通信 eventBus事件总线(兄弟组件)

 src/utils/eventBus.js

import Vue from 'vue';
export const EventBus = new Vue();
<template><button @click="sendData">发送数据到组件 B</button>
</template><script>
import { EventBus } from '@/utils/eventBus';export default {methods: {sendData() {EventBus.$emit('dataEvent', '来自组件 A 的数据');}}
};
</script>
<template><p>收到的数据:{{ receivedData }}</p>
</template><script>
import { EventBus } from '@/utils/eventBus';export default {data() {return { receivedData: '' };},created() {EventBus.$on('dataEvent', data => {this.receivedData = data;});},beforeDestroy() {EventBus.$off('dataEvent');}
};
</script>

组件通信——非父子通信 Provide Inject(跨层级组件)

<template><ChildComponent />
</template><script>
export default {provide() {return {sharedMessage: 'Hello from Provide!'};}
};
</script>
<template><p>收到的数据:{{ sharedMessage }}</p>
</template><script>
export default {inject: ['sharedMessage']
};
</script>

组件通信——非父子通信 $attrs  $listeners

官方文档介绍:包含了父作用域不作为prop被识别(且获取)的attribute绑定(class和style除外)。当一个组件没有生命任何prop时,这里会包含所有父作用域的绑定(class和style除外),并且可以通过v-bind="$attrs"传入内部组件–在创建高级别的组件时非常有用。

通俗地来说就是如果从父组件传过来的值,没有在子组件中被接收,那么这些值就会被存在$attrs对象中。

//Father.vue
<template><div class="father"><span>父亲</span><Son :message="message" :age="18"></Son></div>
</template><script>
import Son from "../components/Son.vue";
export default {data() {return {message: "父组件传过来的值",age: 18,};},components: {Son,},
};
</script>//Son.vue
<template><div class="son"><span>儿子</span><GrandSon v-bind="$attrs"></GrandSon></div>
</template><script>
import GrandSon from "../components/GrandSon.vue";
export default {components: {GrandSon,},created() {console.log("son", this.$attrs);},
};//GrandSon.vue
<template><div class="grandson"><span>孙子</span><div>{{ $attrs.message }}</div></div>
</template><script>
export default {created() {console.log("grandson", this.$attrs);},
};
</script>

组件通信——ref $refs

 引用信息会注册在父组件的$ref对象上   vue2/vue3 ref组件通信

//父
<template><div id="app"><TodoItem ref="msg"></TodoItem><p ref="dom"></p></div>
</template><script>
import TodoItem from './components/so.vue'export default {name: 'App',components: {TodoItem},mounted() {console.log(this.$refs)// 通过这种方法给子组件传递数据this.$refs.msg.getmsg("我是tc") // this.$refs.msg指向的是子组件的实例},
}
</script>//子
<template><div class="so"><p>{{ msg }}</p></div>
</template><script>
export default {name: "todo-item",data() {return {msg: ''}},methods: {getmsg(s) {this.msg = s}}
}
</script>

全局状态管理 vueX

vueX详解(1)

vueX详解(2)

路由

路由详解

路由守卫

路由守卫详解

vue3

基础属性

import { computed, ref } from 'vue';
export default {setup() {const count = ref(0);// 定义一个计算属性const doubledCount = computed(() => count.value * 2);return {count,doubledCount};}
};

const fullName = computed({// getterget() {return firstName.value + ' ' + lastName.value},// setterset(newValue) {// 注意:我们这里使用的是解构赋值语法[firstName.value, lastName.value] = newValue.split(' ')}
})

watch

//ref
<script setup lang="ts">
import { watch, ref } from 'vue'
const sum=ref(1);
// New: 新值 | Old: 老值
watch(sum,(New, Old)=>{console.log(`新值:${New} ——— 老值:${Old}`)
})
</script>
//reactive
<script setup lang="ts">import { watch,reactive} from 'vue'// 响应式变量const sum = reactive({value: 1})// watch是一个函数// 第一个参数: 要监听的响应式变量(数据源)// 第二个参数:执行的回调函数// 第三个参数: 配置(例如deep深度监听/immediate是否立即监听等)// 注意:当监听一个对象时,第一个参数数据源必须是函数且返回一个值即 "() => 对象.要监听的属性"watch(() => sum.value, (New, Old) => {console.log(`新值:${New} ——— 老值:${Old}`)}, { immediate: true, deep:ture })
</script>

watchEffect

  • 不需要手动传入依赖(不用指定监听对象)
  • 无法获取原始值,只能获取更新后的值
  • 立即执行(在onMounted前调用)
  • 一些异步操作放里面更加的合适
const count = ref(0)
watchEffect(() => {console.log(count.value)
})
const stop = watchEffect(() => {/* ... */
})
// 停止监听
stop()

副作用清除  做一些异步请求连发限制或取消请求的操作,保证请求数据的完整和准确性。

watchEffect(async (onCleanup) => {const { response, cancel } = doAsyncWork(id.value)// `cancel` 会在 `id` 更改时调用// 以便取消之前// 未完成的请求onCleanup(cancel)data.value = await response
})

组件通信

父传子

<Child info="我爱祖国" :money="money"></Child>
子组件获取父组件传递数据:方式1
let props = defineProps({money:{type:Number,default:0
}})子组件获取父组件传递数据:方式2
let props = defineProps(["info",'money']);

子传父

<Event2  @xxx="handler3"></Event2>
<script setup lang="ts">
let $emit = defineEmits(["xxx"]);
const handler = () => {$emit("xxx", "法拉利", "茅台");
};
</script>

v-model

<template><child v-model:name="name"></child>
</template><script setup>
import { ref } from 'vue'
import Child from './Child.vue'const name = ref('XXX')
</script>
<template><input :value="name" @input="updateName" />
</template><script setup>
import { defineProps, defineEmits } from 'vue'const props = defineProps(['name'])
const emit = defineEmits(['update:name'])const updateName = (e) => {emit('update:name', e.target.value)
}
</script>

依赖注入 (Provide/Inject)

<script setup>
import { provide, ref } from 'vue'const themeColor = ref('blue')
provide('theme', themeColor)
</script>
<script setup>
import { inject } from 'vue'const theme = inject('theme')
console.log(theme.value) // 'blue'
</script>

ref

<template><TodoItem :ref="(el) => child = el"></TodoItem><p ref="dom"></p>
</template><script>
import TodoItem from './components/so'
import { ref, onMounted  } from 'vue'export default {name: 'App',components: {TodoItem}
}
</script><script setup>const child = ref(null)// const msg = ref()const dom = ref()onMounted(() => {console.log(child.value.getmsg("我是tc"))// msg.value.getmsg("我是tc")dom.value.innerHTML = "我是一个普通的DOM元素"})
</script>
<template><div class="so"><p>{{ msg }}</p></div></template><script setup>
import { ref, defineExpose } from 'vue'const msg = ref("")
const getmsg = (s) => {msg.value = s
}
// 想要父组件可以获取到需要使用defineExpose向父组件暴露
defineExpose({getmsg})
</script>

事件总线

vue3中移除了事件总线,可以借助于第三方工具来完成,Vue官方推荐 mitt 或 tiny-emitter 

全局状态管理 Pinia

Pinia详解

路由

路由详解

路由守卫

vue2、vue3路由区别及原理

vue3路由守卫详解

vue2、vue3生命周期

setup

setup() 钩子是在组件中使用组合式 API 的入口

vue3 setup

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx之proxy_redirect应用

一、功能说明 proxy_redirect 是 Nginx 反向代理中用于修改后端返回的响应头中 Location 和 Refresh 字段的核心指令&#xff0c;主要解决以下问题&#xff1a;协议/地址透传错误&#xff1a;当后端返回的 Location 包含内部 IP、HTTP 协议或非标准端口时&#xff0c;需修正为…

[Qt] mvd使用的注意事项

在使用mvd时&#xff0c;我们可能会有这种需求&#xff0c;比如有一项的数据是文件类型&#xff0c;然后我们要弹出一个文件对话框&#xff0c;选择一个文件路径然后把文件路径展示出来。 我们可能写出如下代码 #include "MyStyledItemDeletegate.h" #include <Q…

LeetCode 220 存在重复元素 III 题解

LeetCode 220 存在重复元素 III 题解 题目描述 给定一个整数数组 nums 和两个整数 k 和 t&#xff0c;请判断数组中是否存在两个不同的索引 i 和 j&#xff0c;使得&#xff1a; abs(nums[i] - nums[j]) < tabs(i - j) < k 方法思路&#xff1a;桶排序 滑动窗口 核…

路由器详细讲解

目录 一、路由器的定义和基本功能 二、路由器的分类 三、路由器的工作原理 四、路由器的配置 五、路由器的选购要点 路由器是一种网络设备&#xff0c;它在计算机网络中扮演着至关重要的角色&#xff0c;主要用于连接不同的网络&#xff0c;并根据数据包的目的地址选择合适…

Spring MVC @CookieValue 注解怎么用?

CookieValue 注解的作用 CookieValue 注解用于将 HTTP 请求中特定 Cookie 的值绑定到 Controller 方法的参数上。 Cookies 是由服务器发送到用户浏览器并保存在本地的一小块数据。浏览器在后续向同一服务器发送请求时&#xff0c;会通过 Cookie 请求头将这些数据再带回给服务…

控制mac地址表端口安全

一、端口安全的核心理论 安全MAC地址类型 安全动态MAC&#xff1a;启用端口安全后动态学习的MAC地址&#xff0c;设备重启后丢失&#xff0c;需重新学习。 安全静态MAC&#xff1a;手动配置的MAC地址&#xff0c;永久生效且不会被老化。 Sticky MAC&#xff1a;动态学习后自动…

【wpf】10 C#树形控件高效实现:递归构建与路径查找优化详解

在WPF应用程序开发中&#xff0c;树形控件的实现是常见且具有挑战性的需求。本文将深入解析一套高效树形结构的实现方案&#xff0c;包含递归构建、路径查找优化、动态交互等多个关键技术点。 一、递归构建树形结构 private TreeItem CreateTreeViewItem(TreeNode node) {var…

面向未来的 TCP 协议设计:可扩展与兼容并存

目录 1.设计思路 &#xff08;1&#xff09;完整数据结构&#xff08;字节布局&#xff09; 1&#xff09;字段解释&#xff1a; 2&#xff09;Flags字段设计&#xff08;1字节位图&#xff09; &#xff08;2&#xff09;进阶版 Java 解码器实现&#xff08;示例&#xf…

MCP 入门指南

文章来源&#xff1a;https://anmolbaranwal.com/ 本文涵盖内容如下&#xff1a; 现有AI工具的问题。MCP及其核心组件介绍。MCP 内部是如何工作的&#xff1f;MCP 解决的问题以及它为何重要。MCP 的 3 个层&#xff08;以及我最终如何理解它们&#xff09;。使用内置 Auth 连接…

第 14 届蓝桥杯 C++ 青少组省赛中 / 高级组真题解析

一、选择题 第 1 题 题目&#xff1a;C 中&#xff0c;bool 类型的变量占用字节数为&#xff08; &#xff09;。 A. 1 B. 2 C. 3 D. 4 答案&#xff1a;A 解析&#xff1a; C 标准规定&#xff0c;bool类型至少占用 1 字节&#xff08;1 byte&#xff09;&#xff0c;用于存…

使用 Selenium 爬取动态网页数据 —— 实战与坑点详解

本文记录了笔者在爬取网页数据过程中遇到的各种技术挑战&#xff0c;包括页面动态渲染、JavaScript 注入等问题&#xff0c;并最终给出一个可运行的完整方案。 文章目录 网页获取不到数据&#x1f680; 尝试用 Selenium 渲染页面 网页获取不到数据 某网页数据依赖大量 JavaSc…

【信息系统项目管理师】法律法规与标准规范——历年考题(2024年-2020年)

手机端浏览☞【信息系统项目管理师】法律法规与标准规范——历年考题&#xff08;2024年-2020年&#xff09; 2024年上半年综合知识【占比分值3′】 42、关于招标投标的描述&#xff0c;不正确的是&#xff08;属于同一集团组织成员的投标人可以按照该组织要求协同投标&#xf…

多模态大语言模型arxiv论文略读(五十六)

DesignQA: A Multimodal Benchmark for Evaluating Large Language Models’ Understanding of Engineering Documentation ➡️ 论文标题&#xff1a;DesignQA: A Multimodal Benchmark for Evaluating Large Language Models’ Understanding of Engineering Documentation …

Docker 渡渡鸟镜像同步站 使用教程

Docker 渡渡鸟镜像同步站 使用教程 &#x1f680; 介绍 Docker.aityp.com&#xff08;渡渡鸟镜像同步站&#xff09;是一个专注于为国内开发者提供 Docker 镜像加速和同步服务的平台。它通过同步官方镜像源&#xff08;如 Docker Hub、GCR、GHCR 等&#xff09;&#xff0c;为…

Unity:AddTorque()(增加旋转力矩)

目录 什么是 AddTorque()&#xff1f; 第一性原理出发&#xff1a;什么是 Torque&#xff08;力矩&#xff09;&#xff1f; Torque 公式 Unity 中 AddTorque 的工作原理 参数属性 &#x1f50d; Linear Drag&#xff08;线性阻力&#xff09; 线性阻力模拟的现实情况&…

async/await的另一种食用方法

在JavaScript/TypeScript的异步编程中&#xff0c;async/await让我们的代码看起来更像是同步的&#xff0c;极大地提高了可读性。然而&#xff0c;错误处理仍然是一个需要仔细考虑的问题。今天我要分享一种优雅的错误处理模式&#xff0c;它能让你的异步代码更加简洁。 传统tr…

计算机网络 - stp生成树实验

【实验假设】 我们使用 Cisco Packet Tracer 或类似的模拟软件&#xff0c;或物理的 Cisco 交换机。 交换机初始为默认配置&#xff08;或已通过 write erase 和 reload 清除配置&#xff09;。 PC 已配置 IP 地址如下&#xff08;示例&#xff09;&#xff1a; PC0: 192.168…

浅析 Spring 中 FactoryBean 的实现与使用

浅析 Spring 中 FactoryBean 的实现与使用 一、FactoryBean核心机制剖析二、高级应用场景与实战三、框架级应用案例解析四、FactoryBean常见面试题 一、FactoryBean核心机制剖析 1. 本质与双重角色 FactoryBean是Spring容器中用于定制化对象创建的核心接口&#xff08;org.spri…

vue3 element-plus 输入框回车跳转页面问题处理

问题描述&#xff1a; 当页面搜索条件只有一个的情况下&#xff0c;输入框不管有没有值&#xff0c;回车后会跳转页面 解决办法&#xff0c;给表单添加 submit.prevent <el-form ref"ruleForm" :model"search" label-width"120px" class&qu…

(51单片机)LCD展示动画(延时函数)(LCD1602教程)

前言&#xff1a; 前面我们说过&#xff0c;之前LCD1602模块有点难&#xff0c;但是现在&#xff0c;我们通过几遍博客的学习&#xff0c;今天来讲一下LCD1602的原理 演示视频&#xff1a; LCD1602流动 源代码&#xff1a; main.c #include <STC89C5xRC.H> #include &q…