2024面试题【vue2】

1.关于生命周期

1.1生命周期有哪些?发送请求是在created还是mounted

beforeCreate:创建之前(eldatamessage都还是undefined,不可用的)

created:创建完毕(能读取到数据data的值,但是DOM还没生成)

beforeMount:挂载之前(生成DOM,但此时{{ message }}还没有挂载data中的数据)

mounted:挂载完毕({{ message }}已经成功挂载渲染data的值)

beforeUpdate:更新之前

updated:更新完毕

beforeDestroy:销毁之前

destroyed:销毁完毕

activated:keep-alive 组件激活时调用

deactivated:keep-alive 组件停用时调用

注意:

  • activated 和 deactivated 是比较特殊的两个钩子,需要keep-live配合使用
  • 当引入 keep-alive 的时候,页面第一次进入,钩子的触发顺序 created => mounted => activated,退出时触发 deactivated。当再次进入(前进或者后退)时,只触发activated

 如果我们的请求不需要获取/借助/依赖/改变DOM,这时请求可以放在Created

反之则可以放在Mounted里

1.2 一旦进入组件会执行哪些生命周期

beforeCreate
created
beforeMount
mounted

1.3父组件引入子组件生命周期的执行顺序是?

父:beforeCreate  created beforeMount

子:beforeCreate  created beforeMount mounted

父:mounted

 1.4 为什么发送请求不在beforeCreate中?beforeCreate和created有什么区别

因为如果请求封装在methods中,在beforeCreate调用的时候,这个阶段时拿不到methods中的方法的所以不行。

beforeCreate中没有data

created中有data 

2.关于组件 

2.1 组件的通信方式

父子组件之间的通信

props

$emit/v-on

attrs/listeners

ref  (http://t.csdn.cn/AGOIR)

.sync

v-model

children/parent

兄弟组件之间的通信

EventBus

Vuex

$parent

2.2 如何找到根组件

this.$root

2.3 slot

默认插槽、具名插槽、作用域插槽

默认插槽:

父组件

<template><div class="container"><!--默认插槽--><!--写在标签上的是父组件以props形式向子组件传递的属性,与插槽无关--><Category title="美食" :listDate="foods"><!--希望向子组件中插入的内容--><img src="img1.jpg"></Category></div>
</template><script>import Category from './components/Category'export default{name:'App',components:{Category}}
</script>

子组件

<template><div class="category"><slot></slot></div>
</template>
<script>export default{name:'Category'}
</script>

 具名插槽

 有时候会同时需要多个插槽,并将其渲染到不同的位置上,此时就需要使用具名插槽

父组件

<template><div class="container"><Category title="美食" :listDate="foods"><!--添加名称--><template v-slot:center><img src="img1.jpg"></template><!--添加名称--><template v-slot:footer><a href="www.baidu.com">百度</a></template></Category></div>
</template><script>import Category from './components/Category'export default{name:'App',components:{Category}}
</script>

 子组件

<template><div class="category"><!--指定名称--><slot name="center"></slot><!--指定名称--><slot name="footer"></slot></div>
</template>
<script>export default{name:'Category'}
</script>

作用域插槽

当数据在组件的自身,而根据数据生成的结构需要组件的使用者来决定时,就要用作用域插槽

假设子组件<current-user>具有user对象数据,此时有如下代码

 父组件

<current-user><template v-slot:default="ScopeData">{{ ScopeData.user.firstName }}</template>
</current-user>

子组件

<span><slot :user="user"></slot>
</span>

3.Vuex

3.1 对vuex的理解

Vuex实现了一个单向数据流,在全局拥有一个State存放数据,当组件要更改State中的数据时,必须通过Mutation进行,Mutation同时提供了订阅者模式供外部插件调用获取State数据的更新。而当所有异步操作(常见于调用后端接口异步获取更新数据)或批量的同步操作需要走Action,但Action也是无法直接修改State的,还是需要通过Mutation来修改State的数据。最后,根据State的变化,渲染到视图上。

3.2 vuex有哪些属性

有五种,分别是 State、 Getter、Mutations 、Actions、 Modules

  • state => 基本数据(数据源存放地)
  • getters => 从基本数据派生出来的数据
  • mutations => 提交更改数据的方法,同步
  • actions => 像一个装饰器,包裹mutations,使之可以异步。
  • modules => 模块化Vuex

各模块在流程中的功能:
Vue Components:Vue组件。HTML页面上,负责接收用户操作等交互行为,执行dispatch方法触发对应action进行回应。
dispatch:操作行为触发方法,是唯一能执行action的方法。
actions:操作行为处理模块,由组件中的$store.dispatch('action 名称', data1)来触发。然后由commit()来触发mutation的调用 , 间接更新 state。可以定义异步函数,并在回调中提交mutation,就相当于异步更新了state中的字段
commit:状态改变提交操作方法。对mutation进行提交,是唯一能执行mutation的方法。
mutations:状态改变操作方法,由actions中的commit('mutation 名称')来触发。是Vuex修改state的唯一推荐方法。该方法只能进行同步操作,且方法名只能全局唯一。
state:state中存放页面共享的状态字段
getters:相当于当前模块state的计算属性 

3.3 Vuex 为什么要分模块并且加命名空间

模块:由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块。

3.4 Vuex和单纯的全局对象有什么区别?

Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。

 3.5 为什么 Vuex 的 mutation 中不能做异步操作?

每个mutation执行完成后都会对应到一个新的状态变更,这样devtools就可以打个快照存下来,然后就可以实现 time-travel 了。如果mutation支持异步操作,就没有办法知道状态是何时更新的,无法很好的进行状态的追踪,给调试带来困难。

action 可以进行一系列的异步操作,并且通过提交 mutation 来记录 action 产生的副作用(即状态变更)

3.6 Vuex中 action 和 mutation 的区别 

mutation中的操作是一系列的同步函数,用于修改state中的变量的的状态。它会接受 state 作为第一个参数,第二个参数是参数。

const store = new Vuex.Store({state: {count: 1},mutations: {increment (state) {state.count++      // 变更状态}}
})

 当触发一个类型为 increment 的 mutation 时,需要调用此函数:

increment: function() {this.$store.commit('increment')
}

 而Action类似于mutation,不同点在于:

  • Action 可以包含任意异步操作。
  • Action 提交的是 mutation,而不是直接变更状态。
const store = new Vuex.Store({state: {count: 0},mutations: {increment (state) {state.count++}},actions: {increment (context) {context.commit('increment')}}
})

Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。

在Vue组件中, 如果我们调用action中的方法, 那么就需要使用dispatch

methods: {increment() {this.$store.dispatch('increment')}
}

3.7 vuex的持久化存储

Vuex是一个仓库,是vue的状态管理工具,存放公共数据,任何组件都可以使用vuex里的公共数据。Vuex提供了插件系统,允许我们使用 vuex-persistedstate插件,将Vuex的状态持久化到本地存储中,解决页面刷新或重新打开应用时状态丢失的问题;

方法一: 通过手写函数和plugins,实现状态、数据持久化话;

新建pluginPersist.js文件,并导出存储函数 

/*** * @param {状态、数据持久化} store */
export default function (store) {// console.log(store);// 存const KEY = 'VUEX:STATE';//这里表示 页面关闭 或 刷新 时存储window.addEventListener("beforeunload", () => {localStorage.setItem(KEY, JSON.stringify(store.state))})// 取try {const state = JSON.parse(localStorage.getItem(KEY));if (state) {store.replaceState(state);}} catch (err) {console.log(err);}
}

在store中,在plugins里引入挂载使用;plugins插件中的函数会在创建仓库时执行,插件的本质就是一个函数

import Vue from 'vue'
import Vuex from 'vuex'
import pluginPersist from "./pluginPersist"Vue.use(Vuex)const store = new Vuex.Store({state: {  // ...状态、数据 },  mutations: {  // ...修改状态、数据},  actions: {  // ...动作函数 },  getters: {  // ...计算属性},  modules: {// ...模块化},//这里使用plugins: [pluginPersist],})export default store;

方法二: 通过手写db对象方法,实现数据、状态持久化;

新建localStorage.js文件,创建db对象,然后导出db方法 

var localStorage = window.localStorage;
const db = {/** * 更新状态 */save(key, value) {localStorage.setItem(key, JSON.stringify(value));},/** * 获取状态,如果有状态值,获取最新状态值;如果没有,获取默认值 */get(key, getSaveVal = null) {try {return JSON.parse(localStorage.getItem(key)) || getSaveVal;} catch (err) {console.log(err);}},/** * 移除状态 */remove(key) {localStorage.removeItem(key);},/** * 清空状态 */clear() {localStorage.clear();}
};
export default db;

 在store中引入使用

import Vue from 'vue'
import Vuex from 'vuex'
import db from './localStorage';Vue.use(Vuex)const store = new Vuex.Store({state: {// 初始化时 默认获取state1: db.get('STATE1') || null,},mutations: {SET_STATE1: (state, value) => {state.state1++//调用SET_STATE1方法时 这里存储db.save('STATE1', state.state1);},},actions: {  // 动作函数 },  getters: {  // 计算属性},  modules: {// 模块化},// 插件plugins: [],})export default store

方法三 :通过vue插件vuex-persistedstate 或 vuex-plugin-persistedstate实现数据、状态持久化;

安装依赖

npm install vuex-persistedstate --save  
//或者  
cnpm install vuex-persistedstate --save 
//或者
yarn add vuex-persistedstate--save是安装在生产环境,开发和生产都需要用到//查看插件的依赖项
npm ls vuex-persistedstate

vuex-persistedstate 和 vuex-plugin-persistedstate 是同一个插件的不同引用方式,它们都是用来持久化 Vuex 状态管理的插件,可以将 Vuex 中的状态保存到本地存储(如 localStorage 或 sessionStorage)中,以便在刷新页面或重新打开应用时恢复这些状态;persist目前已经弃用;

使用

import Vue from 'vue';  
import Vuex from 'vuex';  
import createPersistedState from 'vuex-persistedstate';  Vue.use(Vuex);  export default new Vuex.Store({  state: {  // ...你的状态定义  },  mutations: {  // ...你的变更函数定义  },  actions: {  // ...你的动作函数定义  },  getters: {  // ...你的计算属性定义  },  modules: {// ...模块化},plugins: [  createPersistedState({  storage: window.localStorage, // 或者使用 sessionStorage  }),  ],  
});

4. 路由

4.1 路由的模式和区别

未完待续.....

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

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

相关文章

Web前端轮播结束:技术揭秘与用户体验挑战

Web前端轮播结束&#xff1a;技术揭秘与用户体验挑战 在Web前端开发中&#xff0c;轮播图作为一种常见的页面元素&#xff0c;承载着展示图片、传递信息的重要功能。然而&#xff0c;当轮播结束时&#xff0c;如何处理这一状态&#xff0c;却是一个既具挑战又充满困惑的问题。…

一分钟制作爆火的治愈插画,让插画来替你说出心声

超火的AI治愈插画来了&#xff0c;有趣的文字搭配上有趣的图&#xff0c;无论是发朋友圈还是发小红书&#xff0c;这效果简直无敌。 下面是我刚生成的&#xff0c;快来看看效果吧。 这个工具&#xff0c;国内可用&#xff0c;可以直接上手&#xff0c;不需要什么技术&#xff0…

C# Winform 侧边栏,切换不同页面

在项目中我们经常遇到需要在主界面上切换不同子页面的需求&#xff0c;常用做法是左侧显示子页面菜单&#xff0c;用户通过点击左侧菜单&#xff0c;实现右边子页面的展示。 实例项目实现&#xff1a; 项目左侧侧边栏实现FlowLayoutPanel使用显示不同子窗体 实例链接&#xf…

全网首发:教你如何直接用4090玩转最新开源的stablediffusion3.0

1.stablediffusion的概述&#xff1a; Stable Diffusion&#xff08;简称SD&#xff09;近期的动态确实不多&#xff0c;但最新的发展无疑令人瞩目。StableCascade、Playground V2.5和Stableforge虽然带来了一些更新&#xff0c;但它们在SD3面前似乎略显黯然。就在昨晚&#x…

04.VisionMaster 机器视觉找圆工具

VisionMaster 机器视觉找圆工具 定义 先检测出多个边缘点然后拟合成圆形&#xff0c;可用于圆的定位与测量 注意&#xff1a;找圆工具 最好和【位置修正】模块一起使用。具体可以看下面的示例。 参数说明&#xff1a; 扇环半径&#xff1a;圆环ROI的内外圆半径 边缘类型&a…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] K小姐的服务交换接口失败率分析 (100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 K小姐的服务交换接口失败率分析(100分) 🌍 评测功能需要订…

基于.Net 框架实现WebSocket 简单通信——服务端

新建项目 创建一个.Net 框架的控制台程序。 添加包 项目 → 管理 NuGet 程序包打开包管理窗口&#xff0c;添加SuperWebSocket 程序包。 实现 项目 → 添加类打开添加新项窗口&#xff0c;添加一个C#类。 启动监听 WebSocketServer socket new WebSocketServer();Conso…

Web前端教学实录:深入剖析前端技术的奥秘

Web前端教学实录&#xff1a;深入剖析前端技术的奥秘 在数字化时代&#xff0c;Web前端技术已成为构建现代化网站和应用程序不可或缺的一环。然而&#xff0c;对于初学者来说&#xff0c;前端技术的复杂性和多样性往往令人望而生畏。为了帮助广大学习者更好地掌握Web前端技术&…

PyTorch 数学运算-Tensor基本操作

用如下 a b 进行运算演示 >>> a tensor([[0.7967, 0.5056, 0.7963],[0.8603, 0.7029, 0.7590]]) >>> b tensor([[0.6923, 0.0411, 0.8713],[0.0483, 0.2948, 0.3286]])一般加减乘除运算&#xff1a; add/mimus/multiply/divide >>…

【github】项目的代码仓库重命名

问题 有时候&#xff0c;我们先创建了远端项目仓库&#xff0c;然后就把相关code上传到远端项目仓库。 可能需要结合实际情况对远端项目仓库进行重命名。 当前仓库名称v_ttc&#xff0c;如何将他修改成v_datejs 操作步骤 1、在 GitHub.com 上&#xff0c;导航到存储库的主页…

数据库的字符集和校对规则

数据库的字符集和校对规则是数据库管理系统&#xff08;DBMS&#xff09;中处理字符数据的重要组成部分。以下是对数据库字符集和校对规则的详细解释&#xff1a; 字符集&#xff08;Character Set&#xff09; 1. 定义 字符集是一套用于表示文本字符的编码集合。它规定了如…

(金融:货币兑换)编写一个程序,提示用户输入从美元到人民币的兑换汇率。

&#xff08;金融:货币兑换)编写一个程序&#xff0c;提示用户输入从美元到人民币的兑换汇率。提示用户输入0表示从美元兑换为人民币&#xff0c;输入1表示从人民币兑换为美元。继而提示用户输入美元数量或者人民币数量&#xff0c;分别兑换为另外一种货币。下面是运行示例: pa…

Nginx之Stream(TCP/UDP)负载均衡

Nginx 的 TCP/UDP 负载均衡是应用 Stream 代理模块&#xff08;ngx_stream_proxy_module&#xff09;和 Stream 上游模块&#xff08;ngx_stream_upstream_module&#xff09;实现的。Nginx 的 TCP 负载均衡与 LVS 都是四层负载均衡的应用&#xff0c;所不同的是&#xff0c;LV…

TCP/IP协议深入解析,初学者必看!

简介 在信息技术飞速发展的今天&#xff0c;网络已成为人类社会不可或缺的部分。实现网络中计算机相互通信的关键之一便是TCP/IP协议。作为互联网的基础&#xff0c;TCP/IP协议确保了全球范围内的数据交换和信息共享。 TCP/IP&#xff08;传输控制协议/网际协议&#xff09;是…

LeetCode 2813.子序列最大优雅度

给你一个长度为 n 的二维整数数组 items 和一个整数 k 。 items[i] [profiti, categoryi]&#xff0c;其中 profiti 和 categoryi 分别表示第 i 个项目的利润和类别。 现定义 items 的 子序列 的 优雅度 可以用 total_profit distinct_categories^2 计算&#xff0c;其中 t…

Linux Mint 21.3简介

Linux Mint 21.3是一个更新版本&#xff0c;其中包含了许多新特性和改进。以下是一些主要更新内容&#xff1a; 1. Cinnamon 6.0桌面环境&#xff1a;Linux Mint 21.3采用了最新的Cinnamon 6.0桌面环境&#xff0c;带来了新的功能和改进&#xff0c;例如支持Wayland会话&#…

通勤路上的美好伴侣:倍思H1s头戴式蓝牙耳机

在繁忙的都市生活中,通勤往往占据了人们大量的时间。而在这个过程中,无尽的嘈杂声——公交车的播报声、地铁的轰鸣声、街头的喧嚣——往往成为我们心情的干扰源。在这样的环境下,一款优质的头戴式蓝牙耳机,会让我们的通勤之旅变得更加愉快和舒适。 通勤路上要更舒适—— 倍思…

道可云元宇宙每日资讯|微软称GPT的重点将转向商业和企业场景

道可云元宇宙每日简报&#xff08;2024年6月14日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 微软称GPT的重点将转向商业和企业场景 近日&#xff0c;微软于官网宣布将于2024年7月10日起停止其AI工具Copilot GPTs服务&#xff0c;同时将删除所有由用户创建的既…

LDR6023S:革新USB Type-C接口的完美伴侣

一、引言 随着科技的发展&#xff0c;USB Type-C接口以其高速传输、正反插等特性逐渐取代了传统的USB接口。而在这一背景下&#xff0c;LDR6023S作为一款USB Type-C转音频快充芯片&#xff0c;凭借其卓越的性能和广泛的应用场景&#xff0c;成为了市场上备受瞩目的产品。本文将…

CSP 第34次认证第四题 货物调度

题目链接 只想做一个30分解法。考场上写dfs只能过15分&#xff0c;不思其解。系统未开放评测。 将复现方法粘贴如下&#xff0c;开放数据后再进行测试。 #include <iostream> #include <vector> #include <set> #include <algorithm> #include <m…