vue面试面试

2023-11-07

MVVM
model(js对象data)、view(dom模板代码)、viewmodel(vue实例),ViewModel负责把Model的数据同步到View,还负责把View的修改同步回Model,实现数据-视图分离,数据不会影响视图。

框架优缺点
优点:上手快;组件化开发,提供方便的指令,可以快速构建复杂的交互式应用;vue是单页面应用加快了访问速度和提升用户体验。

缺点:需要利用大量工具包来开发,实际很重;组件多,调试困难

css写法

vue组件中style没有特殊说明就是全局样式,一般都需要局部样式使用以下两种方法

// 第一种
<style scoped>
/* 本地样式 */
</style>

// 第二种
<template>
  <button :class="[$style.button, $style.buttonClose]">X</button>
</template>
<!-- 使用 CSS Modules -->
<style module>
.button {
  border: none;
  border-radius: 2px;
}
.buttonClose {
  background-color: red;
}
</style>

样式穿透

/deep/

双向绑定
(1) 定义: 数据变化视图会自动更新,视图变化数据也会更新
(2) 原理: 数据劫持 + 发布订阅者模式
(3) 实现:采用Object.defineProperty()对数据进行劫持来监听数据变化,并通过getter/setter方法对数据进行读写。其次vue通过发布订阅者模式,维护了一个订阅者数组,当数据发生改变时,vue会通知所有订阅者进行更新,因此当用户在页面上进行修改时。Vue会更新对应的数据,并通知所有订阅者更新视图,同时当数据发生变化时,Vue也会更新对应视图,通过这样的机制,Vue实现了双向绑定
(4) 订阅者是一个概念,它是用于管理更新视图的对象,当数据发生变化时,Vue会通知所有的订阅者进行更新。每一个挂载到视图上的组件或者每一个watcher都可以被看作是一个订阅者,他们订阅了某一个数据的变化,并等待数据发生变化时进行更新,订阅者是Vue实现双向数据绑定的关键组成部分

数据代理
通过一个对象obj2代理对另一个对象obj1中属性x的操作,在vue中,就是把_data中的属性直接放到vm上,是通过vm对象来代理data对象中的属性,好处就是方便操作data

v-model、v-bind
1、v-bind是单向绑定,用来绑定数据和属性以及表达式,数据只能从data流向页面。:
2、v-model是双向绑定,数据能从data流向页面,也能从页面流向data。
3、v-bind可以给任何属性赋值(包括绑定class样式),v-model只能给表单类,也就是具有value属性的元素进行数据双向绑定,注意,v-model不能修饰表达式

compute属性和watch属性
compute:有缓存,不用多次读取,所依赖的数据变化时才重新执行计算属性,method没有缓存要多次读取
watch:监视属性变化时,回调函数handler自动调用,监视属性必须存在,可以开启深度监视
区别:计算属性不能开启异步任务,监视属性可以开启异步任务

绑定class和style样式
用:class   :style绑定样式  数组写法,对象写法,字符串写法

v-if v-show
v-if 指令会动态地创建或移除 DOM 元素
v-show display:none 控制元素的显示与隐藏
v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此:
如果需要非常频繁地切换,则使用 v-show 较好
如果在运行时条件很少改变,则使用 v-if 较好

v-for key  v-for="(p,index) in person" :key="index/p.id"v-for="(val,k) in object"   可以遍历数组对象字符串
会出现的问题:key是vue内部在用的,用index作为key会错乱,用p.id唯一标识不会乱,这是虚拟dom在对比时数组顺序打乱,就出现顺序错乱的问题,没有key会自动用index作为key则顺序可能会乱并开销很大
key的原理:初始数据生成虚拟dom,虚拟dom转为真实dom,用户在真实dom中输入,数据进行更新后,根据新数据生成新虚拟dom,新虚拟dom和之前的真实dom进行对比,一一对比key相同,值不相同则更新,值相同则不更新,对比过后转成新真实dom

更新数组会出现的问题:
this.arr[0]="***"这种修改方式vue监测不到
监测数据的原理:vue在做数据代理之前,加工了data,加了个observer对象,对数据进行getter,setter,深度监视,vue中有set方法,就是方便开发者有新的数据需求的时候也能响应也有gettersetter vm.$set(),Vue.set();vue监测数组时,数组里的数据是没有gettersetter的所以改数组的数据时可能会监测不到,vue中有7个数组方法可以被监视到pop push shift unshift splice sort reverse,vue底层将这些方法包装了一下不是Array原型对象上的方法

自定义指令:
this是window
钩子函数bind inserted update 
经典自定义指令:v-debounce(按钮点击防抖) v-lazyload(图片懒加载) v-test(用户名校验) v-resize(和echarts结合实现图表自适应)https://www.cnblogs.com/zbbk/p/16722606.html

<template>
<div class="box">
 <div ref="zhex" v-resize="resize" style="width:40%;height:100%;bakcground:pink;">
  </div>
</div>
</template>
<script>
import * as echarts from 'echarts'
export default {
  name: '',
  data() {
    return {
     opt:null
    }
  },
  mounted() {
    this.zhexchartInit()
  },
  directives:{
    resize:{
        bind(el,binding){
            let width=""
            let height=""
            function isResezi(){
                const style = document.defaultView.getComputedStyle(el);
                if(width!==style.width||height!==style.height){
                    binding.value() // 关键
                }
                width = style.width
                height = style.height
            }
            el.__vueSetInterval__ = setInterval(isResezi,300)
        },
        unbind(el){
            clearInterval(el.__vueSetInterval__)
        }
    }
  },
  methods: {
    resize(){
        console.log('changed---')
        this.myChart.clear()
        this.myChart.setOption(this.opt)
    },
    //   折线图表
    zhexchartInit() {
      this.myChart = echarts.init(this.$refs.zhex)
      this.opt = {
       xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      data: [120, 200, 150, 80, 70, 110, 130],
      type: 'bar',
      showBackground: true,
      backgroundStyle: {
        color: 'rgba(180, 180, 180, 0.2)'
      }
    }
  ]
      }
      this.myChart.setOption(this.opt)
    }
  },
  components: {}
}
</script>
<style scoped lang="less">
.box{
    width:100%;
    height:100vh;
    background:peachpuff;
    p{font-size:30px;}
}
</style>

生命周期
beforeCreate    在组件实例被创建之初、组件的属性⽣效之前被调用
created           在组件实例已创建完毕。此时属性也已绑定,但真实 DOM 还未⽣成,$el 还不可⽤
beforeMount    在组件挂载开始之前被调⽤。相关的 render 函数⾸次被调⽤
mounted        在 el 被新建的 vm.$el 替换并挂载到实例上之后被调用
beforeUpdate    在组件数据更新之前调⽤。发⽣在虚拟 DOM 打补丁之前
updated                    在组件数据更新之后被调用
beforeDestory    在组件销毁前调⽤
destoryed    在组件销毁后调⽤,组件自定义事件不生效了,原生dom事件还是生效但无响应式

activited    在组件被激活时调⽤(使用了 <keep-alive> 的情况下)
deactivated    在组件失活时调⽤(使用了 <keep-alive> 的情况下)

VueComponent.prototype.__proto__===Vue.prototype

残缺版vue不包含模板解析器,所以用render来完成

组件通信

  • 父组件给子组件传方法,形参为子值,子组件props接收这个函数把值给父组件
  • 父组件给子组件v-on绑定自定义事件,子组件中用$emit触法这个自定义事件并传值给父组件
  • 父组件ref获取子组件用this.$refs.son.$on()绑定自定义事件然后做上一步,$off解绑事件
  • new Vue的beforcreate中定义全局事件总线Vue.prototype.$bus=this,this.$bus.$on()。。。
  • 消息订阅与发布pubsub.js用库实现,类似全局事件总线的方式写
  • webstorage,window,vuex
  • .sync v-model
  • $parent / $children 通过$parent和$children就可以访问组件的实例

$nextTick:在下一次dom更新结束后执行回调,例如可以获取input焦点this.$nextTick(function(){})

slot插槽
默认插槽:在组件中放一个h5标签时例如img,放一个<slot></slot>;                                           具名插槽:当有多个插槽时,slot属性name="***",img属性slot="***";                                        作用域插槽:子传父,父中写<template scope="data">h5标签</template>

vuex
vue插件,实现任意组件间数据共享,以下为工作原理图

actions(处理逻辑判断) mutations(单纯的方法) state(数据) getters(对state加工)为配置项属于store之下的对象{},commit dispatch 为方法

mapstate mapgetters 能映射state和getters中的数据,mapmutations能生成commit方法 mapactions 能生成dipatch方法,,,涉及namespaced:true,需要注意

前端路由原理
前端路由的核心,就在于改变视图的同时不会向后端发出请求;而是加载路由对应的组件。vue-router是vue的插件,专门实现SPA应用,它组件映射到路由, 然后渲染出来的。

登录流程

  1. 点击登录,账号和密码调用后端的登录接口,后端比对,比对错误,返回错误信息给前端
  2. 比对成功,给前端返回一个token值,前端拿到token存储在localstorage和vuex中并跳转页面登录成功,放在vux中是因为vuex数据存在内存中读取更快且响应式,放在localstorage时是因为防止vux数据丢失可以从这里获取数据,两者结合
  3. 前端每次跳转需具备登录状态的页面时,都需要判断token是否存在,如果不存在就跳转到登录页面,存在就正常跳转,利用路由来鉴权

keep-alive两个新钩子

模式:Hash模式、History模式。默认Hash模式
hash模式 : #后面是路由路径,特点是前端访问,不会经过服务器 window.location.hash 
history模式:正常的/访问模式,特点是后端访问,任意地址的变化都会访问服务器
 

vue项目打包生成下面然后去服务器上部署

 npm run build

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue面试面试 的相关文章

  • 调用“DOMNodeInserted”事件时添加元素

    我想在每个 喜欢 按钮 chrome 扩展 之后添加一个元素 由于帖子被添加到新闻提要而不刷新页面 我必须添加一个事件侦听器 DOMNodeInserted 但是当我尝试把after 里面的功能 它不起作用 Code contentArea
  • Typescript:按值检查对象是否存在于数组中

    我有这个数据 roles roleId 69801 role ADMIN roleId 69806 role SUPER ADMIN roleId 69805 role RB roleId 69804 role PILOTE roleId
  • 为什么 jQuery 点击事件会多次触发

    我这里有这个示例代码http jsfiddle net DBBUL 10 http jsfiddle net DBBUL 10 document ready function creategene click function confir
  • 将一个文本框的内容复制到另一个文本框

    假设在文本框中输入了一个条目 是否可以在第二个文本框中保留相同的输入文本 如果是这样 这是如何完成的
  • 何时不使用承诺[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在阅读了数十篇关于 es6 Promise 有多伟大以及为什么我们应该实现它们的文章之后 我有这样的感觉 ALL我的 不平凡的 JavaScri
  • 响应式网格布局框架[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 创建 Cookie 时需要帮助

    我有一个名为yes和另一个名叫no
  • 如何记录返回的事件发射器

    如何记录所发出的事件stream返回于MyFunc 与 JSDoc MyFunc description param Object opts description return Stream description function My
  • JavaScript 动画平滑滚动

    默认情况下 当您有这样的片段链接时 a href some url some fragment some text a 浏览器立即向下滚动到该片段 我该如何编程才能使用标准 JS 顺利地向下移动到该片段 这是一个例子 Example htt
  • HTML colorpicker 发生变化时如何获取新值?

    我正在开发一个需要更改 HTML 颜色的网络应用程序canvas基于的价值观colorpicker 我有一个colorpicker在我需要获取的 HTML 中value从每次更新开始
  • AJAX:检查字符串是否为 JSON?

    我的 JavaScript 有时会在这一行崩溃 var json eval this responseText 当争论时会导致崩溃eval 不是 JSON 在进行此调用之前有什么方法可以检查字符串是否为 JSON 我不想使用框架 有什么方法
  • 访问 TypeScript 数组的最后一个元素

    TypeScript 中有访问数组最后一个元素的符号吗 在 Ruby 中我可以说 array 1 有类似的东西吗 您可以通过索引访问数组元素 数组中最后一个元素的索引将是数组的长度 1 因为索引是从零开始的 这应该有效 var items
  • jQuery 选择器:为什么 $("#id").find("p") 比 $("#id p") 更快

    该页面的作者 http 24ways org 2011 your jquery now with less suck http 24ways org 2011 your jquery now with less suck断言 jQuery
  • 如何清除WebGL中的矩形区域?

    WebGL 有一个clear清除整个表面的方法 清除表面的特定矩形的最佳方法是什么 例如 我想将一个从 50 50 开始的 100x100 像素框设置为全零 ARGB 0 0 0 0 我现在能想到的就是用一个写入零的片段着色器绘制一个四边形
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • 是否可以使用打字稿映射类型来创建接口的非函数属性类型?

    所以我正在研究 Typescript 的映射类型 是否可以创建一个接口来包装另一种类型 从而从原始类型中删除函数 例如 interface Person name string age number speak void type Data
  • 如何在网页上实现文件上传进度条?

    当用户将文件上传到我的网络应用程序时 我想显示比动画 gif 更有意义的内容 我还有哪些可能性 编辑 我正在使用 Net 但我不介意是否有人向我展示与平台无关的版本 如果您对这一切在客户端通常如何工作感兴趣 就是这样 所有解决方案都通过 J
  • ng-model 和值组合不适用于输入文本框

    我有两个输入文本框 我需要组合在两个文本框中输入的值并将其显示在第三个文本框中 如果我只使用value在第三个文本框中 Box 1
  • React Native - 跨屏幕传递数据

    我遇到了一些麻烦react native应用程序 我不知道如何跨屏幕传递数据 我意识到还有其他类似的问题在 SO 上得到了回答 但是这些解决方案对我来说不起作用 我正在使用StackNavigator 这是我的设置App js file e
  • 在javascript中动态生成行?

    我是 javascript 新手 我想在按下 Tab 时动态生成行 并希望获取在动态生成的行中输入的值 以便我可以在 servlet 代码中使用这些值 这是我的html

随机推荐

  • Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000794500000, 576716800, 0)

    linux基于tomcat部署的web应用程序报 Java HotSpot TM 64 Bit Server VM warning INFO os commit memory 0x0000000794500000 576716800 0 f
  • mysql 'performance_schema'.'session_variables' 问题处理

    今天 升级了mysql 5 7 使用mysql workbench时 处理问题 无法连接mysql服务了 先提示 performance schema session variables 不存在 后来提示结构错误 mysql workben
  • linux系统安全检查

    1 使用 last 命令查看下服务器近期登录的账户记录 确认是否有可疑IP登录过机器 检查说明 攻击者或者恶意软件往往会往系统中注入隐藏的系统账户实施提权或其他破坏性的攻击 解决方法 检查发现有可疑用户时 可使用命令 usermod L 用
  • 【网络安全】命令执行漏洞

    命令执行漏洞 命令执行漏洞原理 危害 检测方法 有回显检测方法 分号 从左到右执行 管道符 将见面命令的输入为后面命令的标准输入 后台任务符号 命令从左到右执行 与 逻辑与 前面命令执行成功后才会执行 或 逻辑或 前面执行失败才能执行 反引
  • Java初学疑问之接口为什么能运行Object的方法

    public class CommonTest public static void main String args Animal animal new Dog animal toString 为什么能运行该方法 class Dog im
  • 通过清华大学镜像和pip进行安装

    通过清华大学镜像和pip进行安装 有时候网络不佳时 直接通过pip安装可能会很慢或者不成功 因此可以借助清华镜像 可以在使用pip的时候加参数 i https pypi tuna tsinghua edu cn simple 以gensim
  • 前端实战:小实例1——导航栏

    前言 一个导航栏可看作一个列表 在 HTML 使用 ul 标签和 li 标签元素进行结构表示 在 CSS 中进行样式处理 对应标签元素的具体用法可查看 HTML常见标签介绍 实现思路 使用 div 包装导航栏 用 ul 和 li 标签展示导
  • EasyPoi 数据导入导出,贼方便

    1 maven坐标
  • 银行卡编码规则及检验算法详解

    一 银行卡结构 XXXXXX XXXXXXXXXXXX X 发卡行标识代码 自定义位 校验码 根据ISO标准 银行卡长度一般在13 19位 国际上也有12位的 银联标准卡卡长度一般是在16 19位 双组织卡也有13 19位的 二 发卡行标识
  • grid - 显式网格

    显式网格布局包含 行 列 列 grid template columns page color fff grid padding 1 display grid grid gap 1px grid template rows 50px 100
  • 养生指南 4 : 睡眠 与 外因

    参考 老中医给的100条养生建议 强烈推荐 1 睡眠 1 睡觉 是养生第一要素 睡觉的时间 应该是 晚 21 00 早3 00 因为这个时间是一天的 冬季 冬季主藏 冬季不藏 春夏不长 即第 2 天没精神 早起如在寅时三点至五点 此时切忌郁
  • Python数据分析与可视化------NumPy第三方库

    目录 数据的维度 NumPy CSV文件 多维数据的存取 NumPy的便捷式文件截取 NumPy的随机数函数子库 NumPy的统计函数 NumBy的梯度函数 图像的数组表示 图像的变换 数据的维度 维度 一组数据的组织形式 一维数据 由对等
  • 1.出现需要keil突破内存限制

    出现 error L6050U The code size of this image 37186 bytes exceeds the maximum allowed for this version of the linker 是因为超出
  • openlayers绘制圆形区域,消除误差的一种方法

    我需要以某点为圆心 以某长度 单位米 为半径 在地图上绘制圆形区域 前提 地图显示 图层和数据源的创建与设置方法这里就不详细描述了 直接上关键部分 一开始 我使用如下代码实现圆形区域的绘制 绘制以坐标 1 1 为中心 200000米为半径的
  • Codeforces Round #553 (Div. 2)

    A Maxim and Biology time limit per test 1 second memory limit per test 256 megabytes input standard input output standar
  • 无法通过http://burp获取BurpSuite证书的解决方法

    为了能够对https协议的数据进行抓取必须安装BurpSuite的证书 但在下载证书的过程中出现了问题 官方和百度下载证书的方法都是在能够抓取http的状态下访问http burp下载证书 但http burp页面却加载不出来 百度了很久也
  • 【Bootstrap】Bootstrap基础导航栏(响应式导航菜单)

    Bootstrap基础导航栏 响应式导航菜单
  • 自动化测试(五):自动化测试框架的搭建和基于yaml热加载的测试用例的设计

    该部分是对自动化测试专栏前四篇的一个补充 本次参考以下文章实现一个完整的谷歌翻译接口自动化测试 1 python小脚本 Yaml配置文件动态加载 2 python做接口测试的学习记录day8 pytest自动化测试框架之热加载和断言封装 目
  • 如何自己开发一个Android APP(4)——JAVA

    资源使用 在java文件中 通过资源id完成对资源的访问 可以通过对象 getId 的方法得到组件 因为XML布局文件与java文件实际上是不互通的 也就是说我们的xml只控制外观 当你需要为某个地方作出某些设置时 java必须先获取到这个
  • vue面试面试

    MVVM model js对象data view dom模板代码 viewmodel vue实例 ViewModel负责把Model的数据同步到View 还负责把View的修改同步回Model 实现数据 视图分离 数据不会影响视图 框架优缺