web前端面试题vue

1、vue获取服务器数据的时候,执行函数放到哪个生命周期函数中
一般 created/beforeMount/mounted 皆可,
比如如果你要操作 DOM , 那肯定 mounted 时候才能操作
(在created的时候,视图中的html并没有渲染出来,所以此时如果直接去操作html的dom节点,一定找不到相关的元素,而在mounted中,由于此时html已经渲染出来了,所以可以直接操作dom节点)

2、assets和static文件夹的区别
静态资源处理:
vue-cli有两个放置静态资源的地方,分别是src/assets文件夹和static文件夹,这两者的区别很多人可能不太清楚。

assets目录中的文件会被webpack处理解析为模块依赖,只支持相对路径形式。例如,在 <img src="./logo.png">
和 background: url(./logo.png)中,”./logo.png” 是相对的资源路径,将由Webpack解析为模块依赖。

static/ 目录下的文件并不会被Webpack处理:它们会直接被复制到最终的打包目录(默认是dist/static)下。必须使用绝对路径引用这些文件,这是通过在 config.js 文件中的 build.assetsPublicPath 和 build.assetsSubDirectory 连接来确定的。

任何放在 static/ 中文件需要以绝对路径的形式引用:/static/[filename]。
在我们实际的开发中,总的来说:static放不会变动的文件 assets放可能会变动的文件。

3、vue-router 路由的传参(接收参数)两种方式 query params
参考网址:https://segmentfault.com/a/1190000012735168
1.query方式传参和接收参数

//传参: 
this.$router.push({
        path:'/xxx'
        query:{
          id:id
        }
      })
  
//接收参数:
this.$route.query.id

2.params方式传参和接收参数

//传参: 
this.$router.push({
        name:'xxx'
        params:{
          id:id
        }
      })
  
//接收参数:
this.$route.params.id

注意:params传参,push里面只能是 name:'xxxx',不能是path:'/xxx',因为params只能用name来引入路由,如果这里写成了path,接收参数页面会是undefined!!!
注意:

传参是this.$router,接收参数是this.$route,这里千万要看清了!

另外,二者还有点区别,直白的来说query相当于get请求,页面跳转的时候,可以在地址栏看到请求参数,而params相当于post请求,参数不会再地址栏中显示

4、vue路由跳转的3种方式
参考网址:https://www.cnblogs.com/anjx/p/11242387.html
1.路由标签跳转

<router-link :to="{path, params, query}"></router-link>
<router-link :to="{name, params, query}"></router-link>
<router-link :to="/index/page1"></router-link>
//注意:
//path--跳转路径( 例:path: '/index/page1' )
//name--跳转路由名称( 例:name: 'router name' )

2.函数操作(params方式传参)

// 对象写法
this.$router.push({
   name: 'router name',
   params: {
    key: value
       ...
    } 
})
// 字符串写法
this.$router.push('/index/page1/params1/param2')
//相应的跳转页接收参数格式如下:this.$route.params

3.函数操作(query方式传参)

// 对象写法
this.$router.push({
   name: 'router name',
   query: {
    key: value
       ...
    } 
})
// 字符串写法
this.$router.push('/index/page1?param1=param1&param2=param2')
//相应的跳转页接收参数格式如下:this.$route.query

5 、this. ¥router 和 this.¥route有何区别
¥router为VueRouter实例,想要导航到不同URL,则使用¥router.push方法
¥route为当前router跳转对象,里面可以获取name、path、query、params等
6、path和name的区别
path:是路径,还可以有二级路径比如 path: '/system/setting',但是name就没有了,name就相当于给你的这个 path 起个6名字方便记住,也可以不设置 name。

 {
        path: '/PlayList',
        component: (resolve) => require(['@/views/PlayList/Index.vue'],resolve),
        hidden: true,
        name: '工具',
        children:[
            {
                path: '/Export',
                component: (resolve) => require(['@/views/PlayList/Export.vue'],resolve),
                hidden: true,
                name: '门店'
            }
]
}

7、vue里watch监听数据的变化可以使函数的形式也可以使对象的形式
1.函数形式:

new Vue({
    el:'#root',
    data:{
        cityName:'shanghai'
    },
    watch:{
        cityName(newName,oldName){
            
        }
    }
})

2.也可以是字符串形式的方法名

watch:{
        cityName:’nameChange‘
}

3.也可以写成对象的形式:
包含handler方法
immediate(immediate表示在watch中首次绑定的时候,是否执行handler,值为true则表示在watch中声明的时候,就立即执行handler方法,值为false,则和一般使用watch一样,在数据发生变化的时候才执行handle)、
deep(当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。)

new Vue({
      el:'#root',
      data:{
          cityName:{id:1,name:'shanghai'}
      },
      watch:{
          cityName:{
              handler(newName,oldName){
                    
              },
              deep:true,
              immediate:true
          }
      }
})
//也可以给某个特定属性加监听器
 watch:{
          'cityName.name':{
              handler(newName,oldName){
                    
              },
              deep:true,
              immediate:true
          }
      }

8、computed和watch的区别?
Computed:
1.是计算值,
2.应用:就是简化tempalte里面{{}}计算和处理props或¥emit的传值
3.具有缓存性,页面重新渲染值不变化,计算属性会立即返回之前的计算结果,而不必再次执行函数
Watch:
1.是观察的动作,
2.应用:监听props,$emit或本组件的值执行异步操作
3.无缓存性,页面重新渲染时值不变化也会执行

9、组件里的data为什么是函数形式
1.组件是可复用的vue实例,一个组件被创建好之后,就可能被用在各个地方,而组件不管被复用了多少次,组件中的data数据都应该是相互隔离,互不影响的

2.组件中的data写成一个函数,数据以函数返回值形式定义,这样每复用一次组件,就会返回一份新的data,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据。而单纯的写成对象形式,就使得所有组件实例共用了一份data,就会造成一个变了全都会变的结果

10、vue里怎样写自定义指令

Vue.directive('red',function(){
     return this.el.style.background='red'
})
//使用
<span v-red>vue 指令</span>

11、vue怎样写自定义过滤器

Vue.filter("",function(n,a,b){
   alert(a+','+b);
   return n<10?'0'+n:n
})

12、vue是单向数据流
Vue是单向数据流,数据从父级组件传递给子组件,只能单向绑定。子组件内部不能直接修改从父级传过来的数据

13、解释下路由守卫 (路由的安全 路由的拦截 这三个不知道是不是一回事)
当用户输入后台管理页面的登录地址的时候,让用户返回登录url,不让用户随意进入,也可以使用路由元信息定义路由的时候配置meta字段实现路由的守卫(在meta定义是否需要登录)
参考:https://www.cnblogs.com/elfpower/p/9230528.html
1.全局路由守卫

 router.beforeEach((to,from,next)=>{
    
})

2.路由独享的守卫

cont router=new VueRouter({
    routes:[
    {
        path:'/foo',
        component:Foo,
        beforeEnter:(to,from,next)=>{
        }
    }   
]
})

3.组件内的守卫

beforeRouterEnter/beforeRouterUpDate/beforeRouterLeave
 beforeRouterEnter(to,from,next){
}

14、怎样自定义组件
1.首先创建一个文件夹,来放我们的自定义组件 loading
2.在文件夹里创建一个组件:例如loading.vue
3.在创建一个index.js:
引入loading组件
配置这个组件
导出这个组件,好在main里接收

import LoadingComponent from './loading.vue'

const Loading={
    install:function(){
        Vue.component('Loading',LoadingComponent)
    }
}
export default Loading

4.在main.js里引入我们定义的组件并应用这个组件
5.使用这个组件

<Loading></Loading>

15、vue里请求多个字段会卡顿怎么解决

16、子组件主动获取父组件的数据和方法,父组件主动获取子组件的数据和方法
父组件主动获取子组件的数据和方法
1.调用子组件的时候定义一个ref

<headerChild ref="headerChild"></headerChild>

2.在父组件里面通过

this.$refs.headerChild.属性
this.$refs.headerChild.方法

子组件主动获取父组件的数据和方法
在子组件里面通过

this.$parent.属性
this.$parent.方法

17、vue的常用指令

v-model 绑定到表单的input框
V-for  循环
v-show、v-if 隐藏显示
v-else-if  v-else 配合v-if使用
V-bind  绑定变量  :msg
V-on  绑定事件  @clickbox
V-text 读取文本
v-html 读取html
v-class  绑定类名 :class={red:false}
v-style 绑定样式
V-once  只执行一次  <div v-once>{{msg}}</div>
V-clock  防闪烁 <div  v-cloak > {{msg}} </div>

18、vue里为什么用key
1.可以区分开两个元素,两个元素是独立的---不要复用他们:
例如:登录注册在切换的时候将不会清除用户已经输入的内容。因为两个模板使用了相同的元素 <input>不会被替换掉,仅仅是替换他们的placeholder,这样不符合需求。我们可以给他们加一个key值 来解决这个问题

2.v-for中的key:
为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性。

19、vue里为什么避免v-if和v-for用在一起
v-for比v-if优先,如果每一次都需要遍历整个数组,将会影响速度,尤其是当之需要渲染很小一部分的时候。
解决:使用计算属性来过滤下

Eg:
<ul>
    <li  
       v-for="user in users"
       v-if="user.isActive"
       :key="user.id">
        {{user.name}}
      </li>
</ul>
//以上情况,即使100个user种之需要使用一个数据,也回循环整个数据
//正确
computed:{
     activeUsers:function(){
       return this.users.filter(function(user){
       return user.isActive
          })
     }
}
<ul>
    <li v-for="user in activeUsers" :key="user.id"> 
             {{user.name}}
    </li>
</ul>

20、vue怎样缓存路由(既路由的懒加载、异步组件实现按需加载)
修改router文件里的配置
正常情况下我们路由里边的配置是这样写的

image.png

实现异步加载我们只需把component:改成函数的形式导入组件
或者是这样写:component:resolve=>require([‘@pages/home/Home’],resolve)

image.png

注意:
1.只有app.vue组件很大的时候最少超过1MB的时候才进行异步加载
2.为什么需要懒加载,像vue这种单页面应用,如果没有用懒加载,webpack打包完后会非常大,加载内容多时间长,会出现长时间的白屏,懒加载可以对页面进行划分,需要的时候加载页面,(而且加载一次后会将它缓存,下次访问这个路由不会重新加载)可以有效的分担首页所承担的加载压力,减少首页加载时间
21、Vue里怎样实现跨域
1>、在proxyTable里配置一下 api

proxyTable:{
    '/api':{
        target:'http://localhost:7001',//后端接口地址
        changeOrigin:true,//是否允许跨域
        pathRewrite:{
            '^/api':'/api' //重写
        }
    }
}

2>、再用axios请求数据

22 、src目录下都有哪些文件
assets 存放静态目录
Components 组件
App.vue 主组件
main.js 入口文件

23、vue里出现路由跳转了页面的数据并没有更新问题
原因:是使用了keep-alive把组件包裹起来了,keep-alive在组件切换过程中将状态保留在内容中,防止重复渲染DOM
解决:在activated这个钩子函数里调用数据,而不是mounted这个钩子里;
或者用keep-alive里的include(匹配的组件会被缓存)和exclude(匹配的组件不会被缓存)

24、怎样注册一个组件

25、Axios的请求拦截和响应拦截

//请求拦截
axios.interceptors.request.use((config)=>{
    //发送请求前加载 loading
    return  config
})

//响应拦截
axios.intercepors.response.use((response)=>{
     //数据请求回来后关闭loading
return response
},(error)=>{

return promise.reject(error)
}
})

26、如果有一个vue的单页面的首页,数据特别多,页面特别复杂,让你去做这个页面,从优化性能的方面 怎样去入手?

27、说一下你做过的项目,都碰到过哪些技术难点?

28、使用vue-router 设置每个页面的title
可以再meta里设置title ( 在配置路由的时候给每个路由添加一个自定义 的meta对象,在meta对象中设置一些状态惊醒操作,用他来做登陆校验再合适不过了)

{
      path:'/course/myCourse',
      component:myCourse,
      name:'我的课桌',
      meta:{
    title:'我的课桌'    
       }       
}

29、Vue.set(target,key,value) 响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新

30、action和mutation的区别

1.流程顺序
"响应试图--> 修改state"拆分成两部分,试图触发Action,Action再触发Mutation
2.角色定位
基于流程顺序,二者扮演不同的角色。
Mutation:专注于修改State,理论上是修改State的唯一途径。
Action:业务代码、异步请求。
3.限制
角色不同,二者有不同的限制
Mutation:必须同步执行
Action:可以异步,但不能直接操作 State

31、vuex是什么?怎么使用?哪种功能场景使用它
vuex是一个专为vue.js应用程序开发的状态管理模式。vuex解决了组件之间同一状态的共享问题。当我们的应用遇到多个组件之间的共享问题时会需要:
使用:
创建一个store.js文件,引入vue 、vuex; 使用vuex
定义state、mutations、getters、actions 对象,创建store仓库 把这几个对象导出去
在main.js文件里引入store文件,并注册到 vue实例里

场景:用户登录后可以获取到用户的token 解析token 然后存储到vuex里 可以让登录后的每个组件都可以获取到用户的信息

32、vuex有哪几种属性
state => 基本数据
getters => 从基本数据派生的数据
mutations => 提交更改数据的方法,同步!
actions => 像一个装饰器,包裹mutations,使之可以异步。
modules => 模块化Vuex

33、v-el的作用 :
获取到dom对象;2.0已经废弃了,使用ref

34、vue中引入插件 例如jquery 。。。
1>、安装 npm install jquery --save
2>、在main.js里全局引入;就可以使用了

35、如何定义vue-router 的动态路由以及如何获取传过来的动态参数

定义动态路由:使用path属性过程中,使用动态路径参数,以冒号开头

{
Path:”/user/:id”
}

获取动态路由的参数:

 this.$route.params.id

36 、vue如果封装组件和组件的优点
优点:
提高开发效率
方便重复使用
简化调试步骤
提升整个项目的可维护性
便于协同开发
封装:
新建组件.vue文件内 写好template script style
准备好组件的数据输入 props
准备好组件的数据输出。即根据组件逻辑,做好要暴露出来的方法
使用的时候直接引入,注册 就可以使用

37、 vue-router有哪几种导航钩子?
Vue-router的导航钩子,主要用来作用是拦截导航,让他们完成跳转或取消
有三种方式:
1.全局的:(前置守卫、后置钩子)

//注册一个全局前置守卫:
const router = new VueRouter({...});
router.beforeEach((to,from,next)=>{
    //do someting
})

2.单个路由独享的

const router=new VueRouter({
    routes:[
    {
        path:'/file',
        component:File,
        beforeEnter:(to,from,next)=>{
        //do  someting
        }
    }   
    ]
})

3.组件内的导航钩子(beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave)

const  File={
    template:`<div>This is file</div>`
    beforeRouterEnter(to,from,next){
        //do someting
        //再渲染改组件的对应路由被confirm前调用
    },
    beforeRouteUpdate(to,from,next){
        //do someting
        //在当前路由改变,但是依然渲染该组件是调用
    },
    beforeRouteLeave(to,from,next){
        //do someting
        //导航离开该组件的对应路由时被调用
    },  
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容