vue

vue中的页面跳转?

声明式导航?:   <router-link  :to='...'> 

编程式导航?:    $router.push(...)

router?是用来实现路由跳转,route?用来获取l路由参数

push方法的参数为:要跳转到的路由地址(path)

 

导航守卫?

全局路由守卫   

router.beforeEach((to, from, next)=>{    }
只要访问路由,就会执行导航守卫中 的代码 
因此,就可以在导航守卫中完成请求拦截
三种情况:登录页直接放行
        不是登录页,判断是否登录。  如果登录放行,  如果没有登录,拦截到登录页。
 
 
token机制的说明?
    在项目中,如果登录成功了,那么,服务器会给我们返回token ,这个token就是登录成功的一个标识
    这个token,就相当于使用 cookie+session机制中的 sessionid
    (session和cookie只能在浏览器中使用),移动端原生app没有cookie
 
token相比cookie和session的好处?
    使用场景更广泛,token pc移动端都支持
    
 
除了登录接口以外的所以接口,都需要将token传递给服务器
 
 
登录和拦截的整个流程说明?
    01在登录成功之后,将 token 存储到 localstorage
    02在导航守卫中,先判断当前访问的页面是不是登录页面
    03如果是登录页面,直接放行(  next() )
    04如果不是登录页面,先判断有没有登录
        从localstorage 中获取token,判断有没有登录
        001如果登录了,直接放行  调用next()方法
        002如果没有登录,跳转到登录页面(  next(' /login ')  ),让用户登录

 

 

<style scoped> <style>中scoped的作用?
     组件中加入 scoped后, sylte中的css样式只会对当前组件生效。 不会影响别的组件。 
    <style scoped  lang='sass 或者less'> <style>   直接在lang中加入sass或者less就可以使用sass或者less的语法了。 
 
 
vue 单文件组件中的 lang?
      <style lang='less'> <style>
      作用: 添加  lang='less'后 就可以使用less语法了  。
      但是需要自己安装: npm   i   -D   less   less-loader  。
 
  
    
  vue中怎么阻止默认事件:     @click.prevent="logout"  或者 javascript:;     vue中   阻止a标签的默认行为         
 
 
路由出口?  <router-view>
 
 路由嵌套?
子路由配置,嵌套路由  children[ ]
 const router=new Router({
  routes: [
      //children用来配置子路由,将来匹配的组件将会展示在Home组件的router-view中
    { 
        path:'/Home' , component:Home,
        children:[{path:'Users',component:Users}]
    },
    { path:'/' , component:Home},
  ]
})

 

 关于axios请求传参
 1                axios.get('http://localhost:8888/api/private/v1/users',{
               params:{
 3                            pagenum:1,  //当前页
 4                            pagesize:3  //每页展示多少条数据
 5                      },
 6                      headers:{//将token 做为请求头,传递给服务器接口,这样才能正确的调用这个接口
 7                            Authorization:localStorage.getItem('token')
 8                      }
 9                }).then(res=>{
10                      console.log(res)
11                      const {data,meta}=res.data
12                      if(meta.status===200){
13                            this.userList=data.users
14                      }
15                })

 

 this.$router.push() 和 router.push()?
    在vue组件中使用 this.$router.push()   在vue的组件中才可使用
    在mian.js中使用 router.push()           因为min.js不是路由组件,所以不能使用 this.$router.push
    
     
 
 默认Vue的地址栏中都是用#/路径来跳转,但是#可能和你的锚点地址冲突。如果既想用Vue,又想要锚点地址,只能启用history模式。 启用后,地址栏中就没#了,而是直接用/路径
 
 
什么是路由?
     后端路由: 将所有URL地址都对应到服务器上对应的资源;
     前端路由:浏览器URL中的哈希值视图内容之间的对应规则 ;在vue中路由是 哈希值(hash)组件(component) 的对应规则
 
 
vue中的路由是啥?
    path: 哈希值,表示监听哪个路由连接地址
    component:  表示与path对应的组件
    const router = new VueRouter({
      routes: [// 配置路由规则    
        { path: '/home', component: Home }//哈希值 和 组件 的对应关系
      ]
    })    

 

<router-view></router-view>是干什么的?

    这是vue-router提供的元素,专门用来当做占位符的, 将来路由规则匹配到的组件,就会展示到router-view中(展示路由path匹配到的vue组件

 

<router-link  to=' ' ></router-link>是什么?

      <router-link  to='/login ' ></router-link> 就相当于   <a  herf=' #/login'></a> 
      <router-link  to='/login '   tag="span"></router-link>  加   tag="span" 表示将来在页面 rout-link要变成span标签
 
 

路由的重定向是?    redirect   

    当路径 / 匹配成功后,通过redirect就可以重新定向到其他路由了

    {path:' / ' , redirect: "/home" } redirect就是路由的重定向   

    {path:' / ' , redirect: "/home" }  路径url会变
    {path:' / ' , conponent: "/home" }  路径不会变
  
 
 路由高亮怎么实现?
                当连接被激活的时候 router-link里默认会添加 "router-link-active" 属性,可以用来设置高亮。
                 默认值可以通过路由的构造选项new VueRoute    中的 linkActiveClass  重新设置
    var routerObj = new VueRouter({
      routes: [ // 路由匹配规则 
        { path: '/login', component: login },
        { path: '/register', component: register }
      ],
        linkActiveClass: 'myactive'
    })

 

vue中路由怎么传参? 

    01    使用query方式传递参数(查询字符串)

    <!-- 如果在路由中,使用 查询字符串,给路由传递参数,则 不需要修改 路由规则的 path 属性 -->  
    <router-link to="/login?id=10&name=zs">登录</router-link>
    this.$route.query.id   获取路由的参数
 
    02  使用params方式传递路由参数
     <router-link to="/login/12">登录</router-link>
     { path: '/login/:id', component: login },
    this.$route.params.id 获取路由参数

   

路由嵌套?

    var router = new VueRouter({
      routes: [
        {
          path: '/account', component: account,
          // 使用 children 属性,实现子路由,同时,子路由的 path 前面,不要带 / ,否则永远以根路径开始请求,这样不方便我们用户去理解URL地址
          children: [ 
            { path: 'login', component: login },
            { path: 'register', component: register }
          ]
        }
      ]
    })

 

 

Vue组件data为什么必须是函数?

    为了保证组件和组件之间不会互相影响。把data定义成一个函数,然这个函数,每次都return出一个新的对象, 保证组件之间不会互相影响。

 

计算属性computed 和  watcch?

computed计算属性表示根据已有属性,计算得到一个新的属性
computed里面写一个函数,这个函数很特殊,它的函数名将来可以作为一个属性名来使用
计算属性是依赖于缓存的,当页面中调用同一个计算属性多次的时候,后面的计算属性的值,会直接从第一次得到的结果中去取,所以computed性能比较高,推荐使用计算属性;

// 注意,在computed中不能够使用异步函数
// setTimeout(() => {
// return this.price * this.count + this.yunfei
// }, 200);
总结:computed计算属性 依赖缓存,性能消耗更低; 在使用的时候不能进行异步调用

 

<!DOCTYPE html>
<html lang="en">
  <head>
    <title></title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="./vue2.js"></script>
  </head>
  <body>
    <div id="app">
        <input type="text" v-model="firstName">
        <input type="text" v-model="lastName">
        <h1>全名:{{fullName}}</h1>
        <h1>全名:{{fullName}}</h1>
        <h1>全名:{{fullName}}</h1>
    </div>
    <script>
      var vm = new Vue({
        el: '#app',
        data: {
          firstName: '',
          lastName: ''
        },
        // computed计算属性,它表示根据已有属性,计算得到一个新的属性
        computed: {
          // 在computed里面写一个函数,这个函数很特殊,它的函数名,将来可以作为一个属性来使用
          // 计算属性是依赖于缓存的,当页面中调用同一个计算属性多次的时候,后面的计算属性的值,会直接从第一次得到的结果中去取,所以说,它的性能比较高,推荐使用计算属性⭐
          fullName() {
            console.log('computed')
            // 必须要return
            return this.firstName + this.lastName
          }
        }
      })
    </script>
  </body>
</html>

 

// watch监听器会监听data中数据的变化,只要一变化就能够执行相应的逻辑(函数)
// 监听的数据名放到watch里作为函数名,这个函数里面有两个参数,一个是新值,一个是旧值

 //对比computed而言,computed性能更好,所以能用computed的实现就先用computed;但是 computed不可以异步操作, 而 watch可以进行异步操作.所以只要涉及到异步操作时候要使用watch

深度监听?

    <script>
      var vm = new Vue({
        el: '#app',
        data: {
          user: {
            name: 'jack'
          }
        },
        watch: {
          // 在监听复杂数据类型的时候,不能像之前监听普通数据那样写,我们需要使用深度监听
          // user(newVal, oldVal) {
          //   console.log(newVal)
          // }
          user: {
            // 表示对象中属性变化的处理函数,这个函数只能叫这个名字
            handler(newVal) {      *****
              console.log(newVal);
            },
            immediate: true,  //一旦数据变化就立即执行
            deep: true // 表示开启深度监听   *****
          }
        }
      })
    </script>

 

 

this.$nextTick(    ( )=>{}   )?的作用是,等你页面上的数据刷新完之后,我再执行回调函数中的方法
 
 
 
SPA是什么?
     SPA是单页面应该,只要有一个页面,就不会进行页面跳转。加载新的内容只会更换显示内容。
 
优点?  用户体验好,快,内容改变不需要加载整个页面,避免了不必要的跳转和重复渲染,降低了服务器的压力
    
 
缺点? 初次加载耗时多:需要在加载页面的时候将js css统一加载,部分页面按需加载
    SEO难度大,由于所有内容都在一个页面中动态替换显示,所以在SEO上有着天然的弱势
 
对于传统页面?传统页面每次返回的都是一个完成整的页面
 
实现单页面用的技术? 
    01 AJAX     02 哈希值的使用    03 hashchange事件
 
实现思路
    监听锚点值变化的事件,根据不同的锚点值,请求响应的数据
     
 
 

Class 与 Style 如何动态绑定?

    可以通过v-bind: 和   对象语法或者数组语法进行动态绑定

    <div v-bind:class="{ active: isActive, 'text-danger': hasError }"></div>

    <div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>

 

 
怎么理解vue单向流数据?
    vue中的单向流数据指的是:两个组件之间数据的流动方向
    父组件中的数据可以通过props流动到子组件,并且当父组件中的数据发生改变的时候,子组件自动接收到这个修改后的数据,并且更新页面内容。这就是vue中的单向数据流
 
 
computed和watch的区别和应用场景?
    computed是计算属性,表示根据已有的属性,计算的到一个新的属性。
    computed里面的函数名,很特殊。computed中的函数名可以当做属性名来使用(函数中返回的值必须用 return)
    computed是依赖缓存的,如果缓存不变化,不用重新计算
              computed在使用的时候  不可以异步操作
 
              watch是监听,只要监听的数据发生变化,都出触发监听的函数
    watch中可以进行异步操作
 
应用场景?
总结: 能使用computed就使用computed,以为computed的性能好。   如果需要实监听或者有异步操作,就需要使用watch
 
 

直接给一个数组项赋值,Vue 能检测到变化吗?

    不能,需要使用Vue.set( )/vm.$set( )

 

Vue 的父组件和子组件生命周期钩子函数执行顺序?    

Vue 的父组件和子组件生命周期钩子函数执行顺序可以归类为以下 4 部分:

  • 加载渲染过程

  • 父 beforeCreate -> 父 created -> 父 beforeMount -> 子 beforeCreate -> 子 created -> 子 beforeMount -> 子 mounted -> 父 mounted

  • 子组件更新过程

    父 beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated

  • 父组件更新过程

    父 beforeUpdate -> 父 updated

  • 销毁过程

  • 父 beforeDestroy -> 子 beforeDestroy -> 子 destroyed -> 父 destroyed

 

在哪个生命周期内调用异步请求?

可以在钩子函数 created、beforeMount、mounted 中进行调用,因为在这三个钩子函数中,data 已经创建,可以将服务端端返回的数据进行赋值。但是本人推荐在 created 钩子函数中调用异步请求,因为在 created 钩子函数中调用异步请求有以下优点:

  • 能更快获取到服务端数据,减少页面 loading 时间;

在什么阶段才能访问操作DOM?

    mouted 这个阶段  既有data 又有dom

 

Vue中如何去除url中的#?

    vue-router 默认使用 hash模式, 去除#可以利用history开启另一种模式

         new Router({

    mode: "history"

    routes:[  ]

})

 

关于mvc模式

    controler 从 modle中读取数据,更新到View中

    view中更新的数据通过contorler 更新回model

         controler中需要手动编写大量的dom操作

 

vue中的key?

      key的作用是为了高效的更新虚拟DOM树,提高查找的效率,一次性定位到要修改的元素

 

Vue首屏加载非常慢?

    原因:当打包应用时,将所有javascript代码打包到一个文件中,导致js代码非常庞大,影响页面加载速度

    怎么办?

    01  配置打包工具,将组件分别打包到不同的js代码块中

    biuld/weabpack.base.conf.js

        output:{

          chunkFilename:"[   ]"   //为了懒加载新增,配置后webpack将打包出多个js文件  

          }

    02  当路由请求到该组件时,才动态加载组件的内容

       引入组件时要改为

      import index from './'xxx  改为    const index=()=>import ('./xxx')  仅定义函数  不执行

      当用户在vue中请求当前组件对应的路由地址时,由vue-router自动调用加载函数

 

 

自定义指令有哪些方法?它有哪些钩子函数,还有哪些钩子参数?

    全局指令   Vue.directive( )

    局部指令(只有在当前组件有效)  directives

    钩子函数: bind(绑定事件触发)     inserted(节点插入时触发)     update(组件内相关更新)

    钩子参数:dom元素对象

 

 

 vue双向绑定原理?

      采用数据劫持 结合发布者和订阅者的模式。利用Object.defindeProperty()中的get和set方法来实现的。

       Object.defindeProperty()中有三个参数,第一个是对象,第二是属性,第三个是配置项,配置项中有很多的方法,双向绑定利用的是get 和 set方法
 
 
 keep-alive?

keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,避免重新渲染 ,其有以下特性:

  • 一般结合路由和动态组件一起使用,用于缓存组件;
  • 提供 include 和 exclude 属性,两者都支持字符串或正则表达式, include 表示只有名称匹配的组件会被缓存,exclude 表示任何名称匹配的组件都不会被缓存 ,其中 exclude 的优先级比 include 高;
  • 对应两个钩子函数 activated 和 deactivated ,当组件被激活时,触发钩子函数 activated,当组件被移除时,触发钩子函数 deactivated。

aixos 怎么配置拦截器?

    只要配置了拦截器,那么所有的请求都会走拦截器

    axios.interceptors.request.use  请求拦截器

    axios.interceptors.response.use  响应拦截器

 
 
vue图片资源懒加载
    对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面内未出现在可视区域内的图片先不做加载, 等到滚动到可视区域后再去加载。这样对于页面加载性能上会有很大的提升,也提高了用户体验。我们在项目中使用 Vue 的 vue-lazyload 插件
    解决方法  01 安装vue-lazyload插件      02  在mian.js中引入      03  vue.use(VueLazyload)   
          04 在 vue 文件中将 img 标签的 src 属性直接改为 v-lazy ,从而将图片显示方式更改为懒加载显示:<img v-lazy="/static/img/1.png">
 
 
 
关于 .sync 修饰符

在Vue中,子父组件最常用的通信方式就是通过props进行数据传递,props值只能在父组件中更新并传递给子组件,在子组件内部,是不允许改变传递进来的props值,这样做是为了保证数据单向流通。但有时候,我们会遇到一些场景,需要在子组件内部改变props属性值并更新到父组件中,这时就需要用到.sync修饰符。

 

在vue中不推荐直接操作DOM,但是vue提供了专属的属性  ref,可以获取页面DOM元素的引用

例如:

    <!-- 1.1 ref属性可以用来获取dom的引用,它的值可以随便定义, 但是注意这个名字不要和页面中其他的ref属性名相同 -->
<input type="text" v-model="newId"  ref="inputRef">  // 可以通过vm查看ref的值
      // 1.2 获取定义的ref可以通过this.$refs.ref的名字
      console.log(this.$refs.inputRef);
      this.$refs.inputRef.focus()

 

 插槽 slot------(当你想在子组件标签间加入内容时候,就要使用插槽)

 定义默认插槽通过slot组件定义,定义好了之后, 就相当于一个坑

 

具名插槽

 通过slot添加name属性,来指定当前slot的名字

 

 

作用域插槽(用来传属性和属性值)

  插槽slot中如果携带了属性,又不想丢失,就要用到作用域插槽。

 

 

 

 

 

 

 

 

posted @ 2019-08-11 23:43  javascript9527  阅读(249)  评论(0编辑  收藏  举报