vue 中级基础考察面试题
vue 生命周期有哪些
beforeCreate
created
beforeMount
mounted
beforeUpdate
updated
activated
deactivated
beforeDestroy
destroyed
errorCaptured
初始化请求数据在那个生命钩子里
// 最好放到 created 钩子里,在页面没有渲染之前
mounted
// mounted 钩子,是在dom 渲染完成后调用的钩子,当需要dom 加载完成后执行的操作,需要放到 该钩子函数中
activated deactivated
// 重复进出缓存组件的同时,需要做一下操作时很有用
activated 激活该组件时调用,初次进入也是调用,只要激活该组件
deactivated 组件失活时调用
vue 常用的指令
v-if
v-show
v-model
v-on
v-bind
v-for
v-slot
v-if v-show 的区别
两者都是有隐藏的功能,区别如下
v-if 是dom元素的插入和删除
v-show 是dom元素的显示和隐藏,操作的css样式 display:none/block
vue 父子组件传值的方法有几种
父子组件传值
1,父组件通过 prop 传值,子组件通过 $emit 向父组件 传值
2,通过v-model value input 传值(看下面示例)
3,通过 update sync 进行传值(看下面示例)
4,通过事件总线eveBus
5,直接操作子组件的数据 子组件通过$parent 向父组件传值
6, vuex
// 通过v-model 进行父子组件之间的传值
// v-model 就是一个语法糖 父组件通过默认属性 value传值,子组件通过默认事件 input 向父组件传值
-----------------------父组件-----------------
<template>
<div>
<model v-model="price"></model>
</div>
</template>
<script>
import model from './model.vue'
export default {
name:'parent',
components:{
model
}
}
---------子组件-----
<template>
<div>
<el-button @click="add">增加金额</el-button>
</div>
</template>
<script>
export default {
name:'child',
props: ['value'], // 接受值 value
methods: {
add() {
this.$emit('input', '我是子组件传的值') // 通过默认时间 input 向父组件传值
}
}
}
</script>
// sync update 配合使用
<template>
<div>
<atest :dialogVisible.sync="dialogVisible"></atest>
<button @click="open">显示 弹框 {{ dialogVisible }}</button>
</div>
</template>
<script>
import atest from './atest.vue'
export default {
name:'parent',
components:{
atest
},
data(){
return{
dialogVisible: false
}
},
methods: {
open () {
this.dialogVisible = !this.dialogVisible
}
}
}
------子组件----
<template>
<div>
<span v-if='dialogVisible'>
<el-button @click="close">取 消</el-button>
</span>
</div>
</template>
<script>
export default {
name:'child',
props: ['dialogVisible'],
methods: {
close() {
this.$emit('update:dialogVisible', false)
}
}
}
</script>
vue 组件跨代传值(爷孙组件及更深层组件)的方法
1. $attr $listeners(看示例)
2, provide/inject。(看示例)
3,通过事件总线eveBus
4,直接操作子组件的数据 子组件通过$parent 向父组件传值
5, vuex
$attr $listeners 组件跨代传值
// 父组件
<template>
<div>
<child :price="price" :from='from' :num='num' @upRocket="reciveRocket"></child>
</div>
</template>
<script>
import child from './child.vue'
export default {
name:'parent',
components:{
model
},
data() {
return {
// child 组件接受的参数
from:{
name:'wg',
age:18
},
price:200,
num:2
}
},
methods:{
// 要传递的函数
reciveRocket () {
console.log("reciveRocket success")
}
}
}
// 子组件
<template>
<div class="a">
<div>子组件</div>
<grandson :pageNum='pageNum' :pageSize='pageSize' v-bind="$attrs" v-on="$listeners"></grandson>
</div>
</template>
<script>
import grandson from './grandson.vue'
export default {
name: 'child',
props: ['from'], // 通过props 接受一个from
components: {
grandson
},
data () {
return {
pageNum:1,
pageSize:10
}
},
mounted() {
console.log(this.$attr,'attr')
console.log(this.$listeners,'listeners')
// price num 'attr' (父组件传进来 from price num, 子组件通过props 接受了 from, $attr 就剩下 price num)
// upRocket 'listeners' 父组件定义的函数
},
methods: {
}
}
</script>
// 孙子组件
<template>
<div class="grandson">
<div>孙子组件</div>
<button></button>
</div>
</template>
<script>
export default {
name: 'grandson',
components: {
grandson
},
data () {
return {
}
},
mounted() {
console.log(this.$attr,'attr')
console.log(this.$listeners,'listeners')
// pageNum pageSize price num 'attr' => attr 接受除props 接受的外的 所有属性
// upRocket 'listeners' 接受父组件绑定的函数,(父组件直接绑定的爷组件定义的函数)
},
methods: {
}
}
</script>
如果跨代很多,$attr $listeners就会有点太繁琐,可以考虑 provide/inject
父组件通过 provide传值, 子组件 通过 inject 接受值,不过不是响应式的,具体参考官网(详细)点击这里
// 父级组件提供 'foo'
var Provider = {
provide: {
foo: 'bar'
},
// ...
}
// 子组件注入 'foo'
var Child = {
inject: ['foo'],
created () {
console.log(this.foo) // => "bar"
}
// ...
}
兄弟组件传值
// 1,eventBus
// 2,vuex
// 实际开发中,更倾向于子组件通过$emit 触发父组件函数,父组件再改变值传给 兄弟组件
watch computed 有什么区别
1. 当一个对象改变需要做一些逻辑处理或者开销比较大的时候,考虑使用watch
2. 当多个变量都会对某一个产品影响时,考虑使用 computed
$set 什么用途
// vue2.0 中,数据视图响应式是根据 Object.defineProperty 劫持属性的getter和setter 结合发布订阅者模式实现的,新加的属性实现响应,要用$set 对该属性进项劫持才能实现响应式
怎么缓存组件或者页面
// 用keep-alive,进行缓存,(不需要重新创建卸载 => 缓存)
路由有哪几种模式
// 浏览器端 hash 模式 history模式, 服务端 Abstract 模式,主要介绍浏览器端
// hash 变现为 url路径有#,原理是 通过监听 hashChange 进行路由的转换
// history 是Html5 新加的 History模式,原理是通过监听 pushState popState replaceState 进行路由的转换
路由传参有那些方式 三种方法
// 动态路由 路由表中配置占位符
{
path: '/list/:id',
name: 'list',
component:list
}
// 通过 push 跳转
this.$router.push({
path: `/particulars/${id}`,
})
// 通过 this.$route.params.id 取参
// path 方法传参
this.$router.push({
path: '/list',
query: {
name: 'wg'
}
})
// 通过 this.$route.query.name 取参
// name 方法传参
this.$router.push({
name: 'list',
params: {
age: '18'
}
})
// 通过 this.$route.params.age 取参
路由懒加载有几种 两种 require import
// require 方式
{
path: '/about',
name: 'About',
component: resolve => require(['../pages/About.vue'], resolve)
}
// import 方式
{
path: '/HelloWorld',
name: 'HelloWorld',
component: () => import("@/components/HelloWorld") // @ 通过webpack 配置,默认 指向src 文件
}
vuex 有那几个模块组成
// state 定义变量
// getters 派生状态 类似于计算属性
// mutations 改变 store 中的状态
// actions 主要操作异步操作,在组件中通过 this.$store.dispatch('xxx') 去触发actions方法
// modules 把store 分为细小的模块,应用于复杂的模块
mutations 和 actions 的区别
// mutations 主要用于同步操作 store.commit('xxx') 触发
// actions 主要用于异步操作 store.dispatch('xxx') 触发actions, actions 在通过触发 mutations 更改 state状态
怎么解决 vuex 刷新数据丢失的问题
// 把数据存到 sessionStorage中,当页面刷新时 store的初始值 从 sessionStorage中取
// 其关键点在于 把store的值什么时候存到 sessionStorage中,建议是 当页面刷新之前,可以再入口app.vue组件created钩子中 添加监听 beforeunload 进行处理赋值
最后一个 vue2.0 中 双向绑定的原理 (基础版)
// vue通过 Object.defineProperty 劫持data中各个属性的getter和setter,结合发布订阅者模式 进行数据和视图的响应
vue 中级基础考察面试题的更多相关文章
- Vue学习记录第一篇——Vue入门基础
前面的话 Vue中文文档写得很好,界面清爽,内容翔实.但文档毕竟不是教程,文档一上来出现了大量的新概念,对于新手而言,并不友好.个人还是比较喜欢类似于<JS高级程序设计>的风格,从浅入深, ...
- Vue组件基础用法
前面的话 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己所需, ...
- 一个综合实例讲解vue的基础知识点。
本文通过一个简单的实例来讲解一下vue的基本知识点.通过这个综合实例的讲解,vue的基础知识就会掌握的差不多了. 首先看一下项目的效果:
- Vue入门基础
前面的话 Vue中文文档写得很好,界面清爽,内容翔实.但文档毕竟不是教程,文档一上来出现了大量的新概念,对于新手而言,并不友好.个人还是比较喜欢类似于<JS高级程序设计>的风格,从浅入深, ...
- 数据库基础SQL知识面试题二
数据库基础SQL知识面试题二 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.选课系统SQL语法练习 course数据库中有以下四张表: •students表(学生表): si ...
- 数据库基础SQL知识面试题一
数据库基础SQL知识面试题一 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如标题所示,本篇博客主要介绍基础知识的面试题.大家可以用来测试面试者的技术水平,由于个人水平所限,难免 ...
- Vue组件基础
<!DOCTYPE html><html> <head> <meta charset="utf-8"> ...
- Java基础-考察JVM内部结构的常用工具介绍
Java基础-考察JVM内部结构的常用工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们可以通过jvisualvm.exe考察jvm内部结构.而jvisualvm.exe ...
- react router @4 和 vue路由 详解(一)vue路由基础和使用
完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 1.vue路由基础和使用 a.大概目录 我这里建了一个router文件夹,文件夹下有in ...
随机推荐
- Flink DataStream API 中的多面手——Process Function详解
之前熟悉的流处理API中的转换算子是无法访问事件的时间戳信息和水位线信息的.例如:MapFunction 这样的map转换算子就无法访问时间戳或者当前事件的时间. 然而,在一些场景下,又需要访问这些信 ...
- [转]dd大牛的《背包九讲》
P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 基本思路 这是最 ...
- 简析时序数据库 InfluxDB
时序数据基础 时序数据特点 时序数据TimeSeries是一连串随时间推移而发生变化的相关事件. 以下图的 CPU 监控数据为例,同个 IP 的相关监控数据组成了一条时序数据,不相关数据则分布在不同的 ...
- 大天使之剑H5游戏超详细图文架设教程
引言 想体验传奇游戏霸服的快乐吗?想体验满级VIP的尊贵吗?想体验一刀99999的爽快吗?各种极品装备装备.翅膀.宠物通通给你,就在大天使之剑! 本文讲解大天使之剑H5游戏的架设教程,想研究H5游戏如 ...
- 磁盘“Seagate”没有被推出,因为一个或多个程序可能正在使用它。
推出移动硬盘失败,解决方案: 执行 lsof /Volumes/Seagate/ 可以看到哪些进程在占用磁盘 $ lsof /Volumes/Seagate/ COMMAND PID USER FD ...
- 关于Cloudfront能否接入NLB的讨论
之前讨论过四层应用 是无法通过七层负载负载均衡器转发流量的,因为ALB监听的是Http/s协议,TCP/UDP的请求到了ALB无法识别,ALB在第七层做判断,数据包只有四层,会无法判断转发的目标.相反 ...
- 洛谷P2115 Sabotage G 题解
题目 [USACO14MAR]Sabotage G 题解 本蒟蒻又来了,这道题可以用二分答案来解决.我们可以设答案最小平均产奶量为 \(x \ (x \in[1,10000])\) .然后二分搜索 \ ...
- MySQL——MySQL用户管理
1.MySQL用户定义:用户名+主机域/ip/.. 2.用户作用: 1.登录 2.管理数据库及数据 3.权限: 读和写操作 4.角色: 数据库定义好的一组权限的定义 5.权限范围: 全库:*.* 单库 ...
- poll?transport=longpoll&connection...烦人的请求c
1.问题描述: 最近使用miniui做了一个后台管理系统,打开浏览器调试时,总发现一堆无关的请求,结构大致是:poll?transport=longpoll&connection.....一直 ...
- C# 下载远程http文件到本地
System.Windows.Forms.FolderBrowserDialog dialog = new System.Windows.Forms.FolderBrowserDialog(); ...