博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vue细节的这方方面面
阅读量:6230 次
发布时间:2019-06-22

本文共 8286 字,大约阅读时间需要 27 分钟。

能体现自己平时的技术积累,和自学总结提升能力 这才是不悔走进前端!


vue与React的区别

相同点:

React采用特殊的JSX语法,Vue.js在组件开发中也推崇编写.vue特殊文件格式,对文件内容都有一些约定,两者都需要编译后使用;

中心思想相同:一切都是组件,组件实例之间可以嵌套;都提供合理的钩子函数,可以让开发者定制化地去处理需求;都不内置列数AJAX,Route等功能到核心包,而是以插件的方式加载;在组件开发中都支持mixins的特性。

不同点:

React采用的Virtual DOM会对渲染出来的结果做脏检查;

Vue.js在模板中提供了指令,过滤器等,可以非常方便,快捷地操作Virtual DOM。


vue路由的钩子函数

首页可以控制导航跳转,beforeEach,afterEach等,一般用于页面title的修改。一些需要登录才能调整页面的重定向功能。

beforeEach主要有3个参数to,from,next:

to:route即将进入的目标路由对象,

from:route当前导航正要离开的路由

next:function一定要调用该方法resolve这个钩子。执行效果依赖next方法的调用参数。可以控制网页的跳转


vuex

只用来读取的状态集中放在store中; 改变状态的方式是提交mutations,这是个同步的事物; 异步逻辑应该封装在action中。 在main.js引入store,注入。新建了一个目录store,….. export 。 场景有:单页应用中,组件之间的状态、音乐播放、登录状态、加入购物车

state

Vuex 使用单一状态树,即每个应用将仅仅包含一个store

实例,但单一状态树和模块化并不冲突。存放的数据状态,不可以直接修改里面的数据。

mutations定义的方法动态修改Vuex 的 store 中的状态或数据。

getters类似vue的计算属性,主要用来过滤一些数据。

actions可以理解为通过将mutations里面处里数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据。view 层通过 store.dispath 来分发 action。


vue-cli如何新增自定义指令?

1.创建局部指令
var app = new Vue({    el: '#app',    data: {        },    // 创建指令(可以多个)    directives: {        // 指令名称        dir1: {            inserted(el) {                // 指令中第一个参数是当前使用指令的DOM                console.log(el);                console.log(arguments);                // 对DOM进行操作                el.style.width = '200px';                el.style.height = '200px';                el.style.background = '#000';            }        }    }})复制代码
2.全局指令
Vue.directive('dir2', {    inserted(el) {        console.log(el);    }})复制代码
3.指令的使用
复制代码

下面为一些面试题

vue如何自定义一个过滤器?

html代码:
{
{msg| capitalize }}
复制代码
JS代码:
var vm=new Vue({    el:"#app",    data:{        msg:''    },    filters: {      capitalize: function (value) {        if (!value) return ''        value = value.toString()        return value.charAt(0).toUpperCase() + value.slice(1)      }    }})复制代码
全局定义过滤器
Vue.filter('capitalize', function (value) {  if (!value) return ''  value = value.toString()  return value.charAt(0).toUpperCase() + value.slice(1)})过滤器接收表达式的值 (msg) 作为第一个参数。capitalize 过滤器将会收到 msg的值作为第一个参数复制代码

对keep-alive 的了解?

keep-alive是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。

在vue 2.1.0 版本之后,keep-alive新加入了两个属性: include(包含的组件缓存) 与 exclude(排除的组件不缓存,优先级大于include) 。

使用方法
复制代码

css只在当前组件起作用

答:在style标签中写入scoped即可 例如:

v-if 和 v-show 区别

答:v-if按照条件是否渲染,v-show是display的block或none;

route和router的区别

答:route是“路由信息对象”,包括path,params,hash,query,fullPath,matched,name等路由信息参数。而$router是“路由实例”对象包括了路由的跳转方法,钩子函数等。

vue.js的两个核心是什么?

答:数据驱动、组件系统

vue几种常用的指令

答:v-for 、 v-if 、v-bind、v-on、v-show、v-else

vue常用的修饰符?

答:.prevent: 提交事件不再重载页面;

.stop: 阻止单击事件冒泡;

.self: 当事件发生在该元素本身而不是子元素的时候会触发;

.capture: 事件侦听,事件发生的时候会调用

v-on 可以绑定多个方法吗?

答:可以

vue中 key 值的作用?

答:当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。

如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,

而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。key的作用主要是为了高效的更新虚拟DOM。

什么是vue的计算属性?

答:在模板中放入太多的逻辑会让模板过重且难以维护,在需要对数据进行复杂处理,且可能多次使用的情况下,尽量采取计算属性的方式。

好处:

①使得数据处理结构清晰;

②依赖于数据,数据更新,处理结果自动更新 ; ③计算属性内部this指向vm实例;

④在template调用时,直接写计算属性名即可;

⑤常用的是getter方法,获取数据,也可以使用set方法改变数据;

⑥相较于methods,不管依赖的数据变不变,methods都会重新计算,但是依赖数据不变的时候computed从缓存中获取,不会重新计算。

vue等单页面应用及其优缺点

答:

优点:

Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件,核心是一个响应的数据绑定系统。MVVM、数据驱动、组件化、 轻量、简洁、高效、快速、模块友好。

缺点:

不支持低版本的浏览器,最低只支持到IE9;不利于SEO的优化(如果要支持SEO,建议通过服务端来进行渲染组件);第一次加载首页耗时相对长一些;不可以使用浏览器的导航按钮需要自行实现前进、后退。

vue中子组件调用父组件的方法props
子组件调用父组件的方法可以使用this.$emit()

vue等单页面应用及其优缺点

优点:

1、具有桌面应用的即时性、网站的可移植性和可访问性。

2、用户体验好、快,内容的改变不需要重新加载整个页面。

3、基于上面一点,SPA相对对服务器压力小。

4、良好的前后端分离。SPA和RESTful架构一起使用,后端不再负责模板渲染、输出页面工作,web前端和各种移动终端地位对等,后端API通用化。

5、同一套后端程序代码,不用修改就可以用于Web界面、手机、平板等多种客户端;

缺点:

1、不利于SEO。(如果你看中SEO,那就不应该在页面上使用JavaScript,你应该使用网站而不是Web应用)

2、初次加载耗时相对增多。

3、导航不可用,如果一定要导航需要自行实现前进、后退。


Vue中引入组件的步骤?

1.采用ES6的import ... from ...语法或CommonJS的require()方法引入组件

2.对组件进行注册

代码如下

注册

Vue.component('my-component', {  template: '
A custom component!
'})复制代码

3.使用组件

复制代码

指令v-el的作用是什么?

提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标.可以是 CSS 选择器,也可以是一个 HTMLElement 实例,


请列举出3个Vue中常用的生命周期钩子函数?

created: 实例已经创建完成之后调用,在这一步,实例已经完成数据观测, 属性和方法的运算, watch/event事件回调. 然而, 挂载阶段还没有开始, $el属性目前还不可见

mounted: el被新创建的 vm.el 替换,并挂载到实例上去之后调用该钩子。如果 root实例挂载了一个文档内元素,当 mounted 被调用时 vm.el 也在文档内。

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


Vuex的组成:一个实例化的Vuex.Store由state, mutations和actions三个属性组成:

state中保存着共有数据

改变state中的数据有且只有通过mutations中的方法,且mutations中的方法必须是同步的 如果要写异步的方法,需要些在actions中, 并通过commit到mutations中进行state中数据的更改.


active-class是哪个组件的属性?嵌套路由怎么定义?

vue-router模块的router-link组件。

怎么定义vue-router的动态路由?怎么获取传过来的动态参数?

在router目录下的index.js文件中,对path属性加上/:id。 使用router对象的params.id 例如 : this.$route.params.id;

vue-router有哪几种导航钩子?

三种,一种是全局导航钩子:router.beforeEach(to,from,next),作用:跳转前进行判断拦截。第二种:组件内的钩子;第三种:单独路由独享组件

scss是什么?安装使用的步骤是?有哪几大特性?

预处理css,把css当成函数编写,定义变量,嵌套。

先装css-loader、node-loader、sass-loader等加载器模块,在webpack-base.config.js配置文件中加多一个拓展:extenstion,再加多一个模块:module里面test、loader

axios是什么?怎么使用?描述使用它实现登录功能的流程?

请求后台资源的模块。npm install axios -S装好,然后发送的是跨域,需在配置文件中config/index.js进行设置。后台如果是Tp5则定义一个资源路由。js中使用import进来,然后.get或.post。返回在.then函数中如果成功,失败则是在.catch函数中

8、axios+tp5进阶中,调用axios.post(‘api/user’)是进行的什么操作?axios.put(‘api/user/8′)呢?

跨域,添加用户操作,更新操作。

9、什么是RESTful API?怎么使用?

是一个api的标准,无状态请求。请求的路由地址是固定的,如果是tp5则先路由配置中把资源路由配置好。标准有:.post .put .delete

10、vuex是什么?怎么使用?哪种功能场景使用它?

vue框架中状态管理。在main.js引入store,注入。新建了一个目录store,….. export 。场景有:单页应用中,组件之间的状态。音乐播放、登录状态、加入购物车

app4.todos.push({ text: '新项目' }),列表最后添加了一个新项目。
  1. {
    { todo.text }}
var app4 = new Vue({ el: '#app-4', data: { todos: [ { text: '学习 JavaScript' }, { text: '学习 Vue' }, { text: '整个牛项目' } ] }})复制代码

使用 Object.freeze() , 停止响应系统的追踪变化 使数据不能改变,试图不能刷新

$watch 是一个实例方法vm.$watch('a', function (newValue, oldValue) {  // 这个回调将在 `vm.a` 改变后调用}复制代码

其下是vue细节方面的处理

  1. 不要在选项属性或回调上使用箭头函数 ,箭头函数没有this

  2. v-once 指令,数据改变时,{

    {}} 中的内容不会更新

  3. 站点上动态渲染的任意 HTML 很容易导致 XSS 攻击 绝不要对用户提供的内容使用插值

  4. {

    { }} 里面只能包含表达式的语句 三元运算符 函数表达式

  5. attributeName 是获取js动态值 Vue 实例有一个 data 属性 attributeName,其值为 "href",那么这个绑定将等价于 v-bind:href<a v-bind:[attributeName]="url"> ...

  6. 空格和引号,放在 HTML 特性名里是无效的,在 DOM 中使用模板时你需要回避大写键名 ❌错误写法 <a v-bind:['foo' + bar]="value"> ...

  7. 浏览器会把特性名全部强制转为小写

<a v-bind:[someAttr]="value"> ...

  1. 计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值

  2. 使用 watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的

  3. created 里 可以 直接调用methous里的方法,直接this.方法名

  4. axios 里面 .then 里用箭头函数作为回调函数,回调函数里 this 指向window ,耦合this指向。返回的是promise对象

  5. axios.defaults.baseURL = "";设置请求路径的公共部分

  6. vue 中图片懒加载 插件 vue-lazyload

  7. 多种写法 v-lazy 图片路径

  8. 开发时,vue路由不使用h5模式,h5模式回车会404

  9. router-link中 tag属性定义标签类型

  10. router-link自带class类名,定义激活样式

  11. router在vue实例里挂载后,每个组件都会有一个$router的属性

methods:{    fn(){        this.$router.push("locain")    }}//push   强制跳转路径//go     数字决定返回还是前进//repalce  路由替换,将当前的历史替换掉## vue路由,redirect重定向## vue路由中子路由不带/,带/表示了一级路由this.$route.params.c
商品1
// /article/2/d 匹配出一个对象// /article/:c/:a =>{c:2,a:'d'} = this.$route.params## 如果用对象作为to的属性,并且使用了参数,必须给路由起个名字,通过名字跳转
1
let routes=[{path:'/article/:c/:a',component:article,name:'pro'}]## 路径参数发生变化 vue实例中watch 监控参数的变化来发送ajaxwatch:{ $route(){ alert('ajax'); }}## 组件之间路由切换会进行销毁, 用keep-alive 进行缓存,不让销毁。## vue路由元信息哪个单页面组件需要缓存,在路由配置里加上meta:{keep:true}//需要缓存的页面
//不需要缓存的页面
## 路由动画
## 路由懒加载不再采用引入组件的方法,采用动态使用组件。实现路由懒加载。routes=[{path:"/",name:"home",component:()=>import("../components/home.vue")}]## vue路由全局导航钩子 router.beforeEach(function (to,from,next) { // 拦截功能 if(to.path==='/list'){ next(path:'/add') }else{ next() }})## vuexstore 容器中保存着公共数据state改变store中的state 通过mutation 中commit来改变方法去变更状态,并且是同步的需要支持异步,通过actions 改变 mutation 方法状态管理,将数据统一管理vuex 单向数据流容器store 是唯一的 只能有一个store 被注册到了实例上 , 所有组件都会有一个 属性 this.$storevuex 实例上加上 strict :true 严格模式 ,只能通过mutation 更改状态mutations 中的方法 第一个参数 是 state是自动放入的,默认指的是当前的state第二个参数是载荷,传过来的值const mutations = { add(state){ state.count +=1; }};## vuex 提供日志插件 logger 实时监听并记录vuex数据状态变更const store = new Vuex.store({ state, mutations, plugins:[logger()], strict:true})## vuex 提供 getters 计算属性,相当于computedconst getters = { val:(state)=>state.count%2?'1':'2';}import Vue from 'vue';import Vuex from 'vuex';import logger from 'vuex/dist/logger';Vue.use(Vuex);let state = {car:[]};import mutations from './mutations';export default new Vuex.store({ state, mutations, strict:true, plugins:[logger()]});复制代码

。。。未完待更新!

转载地址:http://nfena.baihongyu.com/

你可能感兴趣的文章
1178:成绩排序
查看>>
php总结8——mysql函数库、增删改
查看>>
20170914-构建之法:现代软件工程-阅读笔记
查看>>
HDU5616 天平能否称出物体重量问题 01背包变形或者折半搜索
查看>>
关于group by 两个或以上条件的分析
查看>>
低功耗蓝牙BLE外围模式(peripheral)-使用BLE作为服务端
查看>>
二分法详解
查看>>
Chisel3 - Tutorial - Functionality
查看>>
杨辉三角之c实现任意行输出
查看>>
第九次作业(有好多都彻底不懂了)
查看>>
[转载]过滤器(filter)和拦截器(interceptor)区别
查看>>
UML 类图
查看>>
【LeetCode】21. Merge Two Sorted Lists
查看>>
Keras卷积+池化层学习
查看>>
Android XML 布局 常用或不常用属性!
查看>>
[Aizu2224] Save your cats
查看>>
leetcode796
查看>>
剑指Offer 51 数组中的逆序对
查看>>
EBS多语言
查看>>
多线程系列五:并发工具类和并发容器
查看>>