前端学习之vue

含义:

         渐进式JavaScript 框架

优势:

    易用--已经会了 HTML、CSS、JavaScript?即刻阅读指南开始构建应用

     灵活--不断繁荣的生态系统,可以在一个库和一套完整框架之间自如伸缩

     高效--20kB min+gzip 运行大小,超快虚拟 DOM,最省心的优化

MVP模式与MVVM模式:

         传统的开发模式为MVP模式,例如使用jquery书写逻辑。这种模式大量的代码都在P层,而P层大多数代码都是直接操控DOM,性能很低

        Vue.js采用MVVM模式,这种模式大多数代码都是在M层,也就是说Vue主要是依靠数据进行驱动的

使用:

             官网下载vuejs库:

             CDN:

             NPM:npm install vue

{{}}--插值表达式
{{val}}
  • {{item}}
{{obj.name}}

 
{{counter}}

    指令:

{{3+5}}

{{val}}

{{val}}

{{val}}

    v-bind:

v-bind: 
 含义:绑定数据(表达式)到指定的属性上
 简写:冒号(:)

{{val}}

6666

{{val}}

y>

  列表渲染:

含义:
   根据数据循环渲染 `v-for` 指令所在的元素及其子元素。
   可以循环的数据:Array | Object | number | string | Iterable (2.6 新增) 
:key:项目中唯一的id标识


  • {{item}}

  v-model:

 使用:
     表单 
                 

您输入的值是:{{name}}

您选择的单选按钮为:{{name}}

您选择的多选按钮为:{{name}}

您选择的下拉选项为:{{name}}

{{name}} {{age}} {{age}}

事件:

事件绑定:
   v-on,简写@
事件修饰符:
  .stop   阻止事件冒泡
  .prevent  阻止事件默认行为
  .self 事件不是从内部元素触发的
  .once 事件只触发一次
按键修饰符:
 .enter
 .space
 .up

计算属性:

含义:处理复杂的数据
{{ msg.slice(0,1).toUpperCase()+msg.slice(1) }}

计算属性1:{{ firstLetter }}

侦听器:

含义:
   侦听数据变化,异步或者开销大操作比较方便

侦听器:{{ fullName }}

计算属性:{{ getFullName }}

ref,nextTick :

ref:
    给元素或组件添加 `ref` 属性,则该元素或组件实例对象将被添加到当前组件实例对象的 `$refs` 属性下面。
nextTick:
     当数据更新的时候,视图并不会立即渲染,这个时候我们期望获取到视图更新后的数据,可以通过 `nextTick` 来进行操作

    

{{title}}


vue组件:

    组件注册:

//全局组件:
Vue.component('组件名称', {组件选项})

//局部组件
new Vue({
  ...,
  components: {
  	'组件名称': {组件选项}	
	}
})

props:
   组件中内部私有数据存储中组件 `data` 中,通过外部传入的数据,则通过 `props` 选项接收

    

   组件通信:

          父向子:

//不太详细,仔细说明下:
父元素::quantity="initQuantity" 传递
子元素: props 接收


父组件:{{quantity}}

//子元素 直接使用this.元素使用即可

          子向父:

子元素:this.$emit('自定义事件名称', 事件数据)传递
父元素:自定义事件名称appIncrement(){} 接收


父元素:
  

  定义一个appIncrement函数接收

子元素:
this.$emit('自定义事件名称', 事件数据)

          其他:

四个不推荐的:
 $root     直接获取根组件的数据
 $parent   直接获取父组件的数据
 $children 直接获取子组件的数据
 $refs     直接获取子组件的数据,渲染完成后才能使用
   不可以在html中使用
个可用:
 provide选项inject方法     跨级通信
   传递:      provide(){
          return{
              msgs:this.msg
          }
      }
    接收: inject:['msgs']
 vuex                      兄弟通信(bus总路线)

props:

1 prop大小写:
   prop最好写成连字符形式,接收的时候可以写成
2 prop类型:
   接收类型:一般为数组
   定义接收的类型:
     props的类型改为对象
3 prop验证:
    在类型的基础上,继续改写
     类型:    type:类型
     默认值:   default:函数
     是否必传list属性: require:true/false
     自定义验证函数:
        validator: function (value) {
           // 这个值必须匹配下列字符串中的一
        return ['success', 'warning', 'danger
          }
 4 单向数据流:
     父级prop的更新会向下流动到子组件中,但是反过来不行
     单向下行绑定,父组件传递给子组件的数据,不能直接进行修改
 5 传递静态或者动态的prop
     静态的: msgs='msgs'
     动态的:可以传入:数字,字符串,数组,对

组件双绑:

v-model:
  含义:用于实现数据双向绑定的指令
  原理:value和input  (原理:object.defineProperty())
.sync: 实现组件的双绑
.native 将原生事件绑定到组件中
          
  



      插槽 :

 

这是内容

动态组件:

keep-active标签:
    是动态组件利用缓存加载,
    组件外层包裹使用,使用时会在原来生命周期的基础上增加两个生命周期activated和deactivated
transition标签:
   切换时具有动态效果
   使用:条件渲染,条件展示,动态组件,组件根节点

vue-cli:

     含义: vue cli是一个基于vue.js进行快速开发的完整系统,又称vue脚手架
     安装:npm  i -g @vue/cli
     检测:vue -V /vue --version
     打包工具:webpack
     特点:基于webpack构建,并带有合理的默认配置

     使用:

  1 创建:vue create 项目名称(项目名称不写
  2 配置项:
      Choose Vue version                  选
      Babel                               将
      TypeScript                          配
      Progressive Web App (PWA) Support   移
      Router                              配
      Vuex                                配
      CSS Pre-processors                  cs
      Linter / Formatter                  是
      Unit Testing                         
      E2E Testing                           
  3   node-modules      存放依赖
      public            存放静态资源
          不要改写index.html文件
      .browserslistrc   存放浏览器的数据内容
      .gitignore        存放不上传或者忽略的
       babel。config。js babel的配置
       readme。md        项目的介绍指令
       package.json     显示下载的依赖, jso
       src       
         main.js       项目的主入口,整个项
         APP.vue       项目的根组件
         components    项目的公共组件
         assets        存放静态资源 
           assets:通过import的方式作为模块
           public: 通过script,link,img等
       views            存放页面级组件
       单文件组件:以vue结尾的文件
          三大内容:template,script,style 

vue-router:

      多页应用(MPA):
            优点:首屏渲染快,利于SEO(搜索引擎优化)
            缺点:页面之间跳转慢
      单页应用(SPA):
           优点:页面之间跳转快,
            缺点:首屏渲染慢,不利于SEO(可以使用Vue SSR-----vue服务渲染解决)
        含义:Vue.js官方的路由管理器。他和vue.js的核心深度集成,让构建单页面页面变得易如反掌
        安装:
            1 npm i vue-router
            2 在创建项目时选择router配置

      使用:

            动态路由:

异步加载:访问时加载  component:()=>import('./../views/about')
动态路由:
  声明式导航: 
       属性:to  from
  动态路由:  path:'/user/:username',
  获取动态路由的参数:$route.params.username
  侦测动态路由:
     watch:{
       $route(){
           内容
       }
     }
   路由优先级:谁先写,谁的优先级高
   404问题:
     {
     path:'/*',
      component:()=>import('./../views/notfind')
      }     
当动态路由需要被应用于更多场景的时候,使用动态组件传参
1 index 动态路由上,添加props:true
2 将$router.params.username 改为username 动态路由父组件添加props:[username]接受参数 
3 通过传递username和应用

       路由对象:

获取当前路由的信息    $route
获取router对象:     $router
    方法:push,go,replace
编程式导航:
    $router.push()  会产生历史记录
    $router.replace() 不产生历史记录
    $router.go(数值)     在产生历史记录的基础上进行(正值)前进和(负值)后退
    两种传参方式:params 不显示在地址栏上,query显示在地址栏上
    通常使用name和params配合传参,path和query配合传参,path不能携带params传参   

     子路由:

嵌套路由:
   在路由里添加children属性
      children:[{
        path:'',
      },{
          path:''
      }]
       子路由的path的路径不加‘/’,一旦添加/等同于根路径
      如果子路由的path为空,表示为默认子路径name值为父路径的name,父级name为空,如果一个路由有默认子路由,

   命名路由:

可以给每个路由设置name属性,可以使用该属性进行路由跳转
   1 声明式导航:
       微信|
   2 编程式导航:
        his.$router.push({name:'wx',params:{num:33}})
命名视图:
     默认视图名:default
    router-view name="组件名">
       components:{
           efault:组件名
     }

重定向与别名:

重定向:
 访问某个路由时,自动跳转到另一个路由上
 方式:
      redirect:'/wx',
      redirect:{name:'wx'},
      redirect:function(){
         let type=localStorage.getItem('type')
         return {name:type||'wx'}
      }
别名:alias
   '/a'的别名是'/b',意味着,当用户访问'/b时自动跳转到’/a的页面,URL保持/b不变

路由模式:

history模式:
  一个正常的URL:http://localhost:8081/wx
  缺点:当你访问一个不存在的的路由的时候,会返回404
  解决:配置/*路由
hash模式:
   http://localhost:8081/#/wx
   不是真正的URL,当用户访问不存在的地址时,不会出现404

路由守卫:

    含义:进入或离开路由时会自动执行一些钩子函数。这些函数称为路由守卫

    全局守卫:

全局守卫(所有路由):写在index。js底部
  // 1 进入前:
  routers.beforeEach((to,from,next)=>{
      console.log('进入前');
      console.log(to);
      console.log(from);
      next()  //放行
  })
  // 2 解析完成:在导航被确定之前,同时在所有组件内守卫和异步路由被解析之后,解析守卫被调用
  routers.beforeResolve((to,from,next)=>{
      console.log('解析完成');
      console.log(to);
      console.log(from);
      next()  //放行
  })
  // 3 离开前
  routers.afterEach((to,from)=>{
      console.log('离开前');
      console.log(to);
      console.log(from);
  })

   独享守卫

独享守卫(配置的路由):写在index。js路径里
beforeEnter: (to, from, next) => {
console.log('login的独享守卫');
console.log(to);
console.log(from);
next()
},

组件守卫:

组件内的守卫(组件内路由)
    beforeRouteEnter: (to, from, next) => {
    console.log('login组件内的进入前')
    console.log(to);
    console.log(from);
    next()  //放行
},
beforeRouteUpdate() {
    console.log('login组件内的解析完成')
    console.log(to);
    console.log(from);
    next()  //放行
    
},
beforeRouteLeave (to, from, next) {
console.log('login组件内的离开前')
console.log(to);
console.log(from);
next()
}

路由元信息:

当一些页面需要特殊身份才能进入时,可以使用meta
  在路由上:meta:{isteacher:true}   //路由元信息
 在全局路由上验证身份
 routers.beforeEach((to,from,next)=>{
        if(to.matched.some(item=>{item.meta.isteacher})){
          console.log('教师专区');
           next({name:'login'})
         }else{
           next()
          }
          })

vuex:

      含义:一个专门为vue。js应用程序开发的状态管理模式(仓库/商店)

      安装:1 npm i vuex

                 2 创建项目时配置vuex

     核心:

           state 用来存放公共状态

使用:{{$store.state.状态名}}/this。$store.state.状态名
经常把state状态存储在计算属性中
    如何存放:mapState辅助函数,把状态一起搬到组件中的计算属性
      import {mapState} from 'vuex'
      ...mapState(['mag','msg'])

        getter store的计算属性,用来加工state的状态

经常把getter储在计算属性中
  如何存放:mapGetter辅助函数,把状态一起搬到组件中的计算属性
    import {mapGetter} from 'vuex'
    ...mapGetter(['mag','msg'])

    mutations 修改state中的状态(仅同步)

组件内:触发store的mutation的addPrice方法
  1 不传参
  addPrice(){
      this.$store.commit('addPrice')
  }
  mutations:{
    addPrice(state){
      state.price++
      }
  },
  2 传参
   changeAge(value){
      this.$store.commit('changeAge',value)
     }
  mutations:{
      addPrice(state){
       state.price++
      },
          changeAge(state,playload){
          state.age=playload
            }
   },

    actions 修改atate中的状态(支持异步)

    不能直接修改,只能通过触发mutations来修改state
     this.$store.dispatch('addPrice').then(res=>{
       console.log(res);
   })
    actions:{
addPrice(context){
 return new Promise((reslove,reject)=>{
   setTimeout(()=>{
       context.commit('addPrice')
       reslove(context.state.price)
   },100)
   return 'win'
 })
}

    models 模块化:

新建一个文件
  导入:import 名称 from '路径'
        注册在models :名称
  导出:export default 名称

你可能感兴趣的:(前端学习笔记们,前端,学习,vue.js)