• VUE基础


    一.安装相关

    全局安装脚手架:npm install -g vue-cli

    创建一个基于 webpack 模板的新项目: vue init webpack my-project

    下载依赖:npm install …

    二.组件结构

    <template>  //vue2中必须有根元素包裹所有代码,类似与react的render函数中

        HTML 表达式{{ }},

        v-link,

        v-for,  vue1中支持返回$index,vue2不支持,同时vue2支持循环重复元素

        v-mode,

       v-if, v-else(同angular 增删dom) v-else必须跟在v-if/v-show后面 否则无法识别

       v-show 

    v-on: 监听DOM事件 缩写@
          <a v-on:click="doSomething"> 
    filterBy filterKey: 配合指令实现,根据filterKey作为筛选条件 
                vue2中删除了内置过滤器,保留自定义过滤器(传参有区别):
                        Vue.filter('toDou',function(n){

                                                     //alert(input);

                                                     return n<10?'0'+n:''+n;

                                             });

    v-bind: 缩写:
           <a href="javascripit:void(0)" v-bind:class="activeNumber === n + 1 ? 'active' : ''">{{ n + 1 }}</a>

                    过滤器(形式同angular) {{ message | reverse | uppercase }}

     </template>

    <script> import export 逻辑处理

    new Vue({                //创建vue实例

          el: '#app',            //el指向view,将vue实例挂载到

          data: {

            todos: [

              { text: 'Learn JavaScript' },

              { text: 'Learn Vue.js' },

              { text: 'Build Something Awesome' }

            ]

          },

         Components:{

          ‘child-component’:{

             Template:”#childComponent”,

             Props:{                //定义组件的props属性

                 Datalist: Array,   //props验证

                 Name: String

             }

          }

        },

       Methods: {

       },

       Events: {

       }

    })

    </script>

    <style>样式</style>

    三.组件通信

    1.父à子:类似与react 通过属性props传值

       子组件中定义props:

    Components:{

      ‘child-component’:{

         Template:”#childComponent”,

         Props:[“name”,”age”]

    }

    }

       对子组件的引用,通过v-bind实现属性绑定:

      <child-component v-bind: name=”name”  v-bind: age=”age”></child-component>

      Props默认是单项绑定,可以使用v-bind: name.sync=”name”来显式指定双向绑定

    子à父、子à子:小项目中用事件派发$dispatch()和事件监听$on()就可以解决,但是复杂的大项目呢?(事件派发用法类似于angular 但是vue2中已移除)

    Vuex见五: 

    四.组件访问

    父组件访问子组件:

    $children: this.$children是一个数组,包含所有子组件的实例

    $ref: 子组件使用v-ref指令,为自己声明一个索引ID,方便父组件通过this.refs。索引名 访问到子组件实例,而不用按顺序访问

    子组件访问父组件:

    $Parent: 访问父组件链上的任意实例,但是在子组件中修改父组件的状态是非常糟糕的方法,

    五.Slot

    Vue组件的API来源于三部分----props,slot和事件

    Props允许外部环境传递数据给组件

    事件允许组件触发外部环境的action

    Slot允许外部环境插入内容到组件的视图结构内

    六.生命周期(vue2)

    beforeCreate    组件实例刚刚被创建,属性都没有

     created    实例已经创建完成,属性已经绑定

     beforeMount    模板编译之前

     mounted    模板编译之后,代替之前ready  *

     beforeUpdate    组件更新之前

     updated    组件更新完毕    *

     beforeDestroy    组件销毁前

     destroyed    组件销毁后        

    七.Vue2动画:  transition 组件

    class定义:

       .fade-enter{} //初始状态

     .fade-enter-active{} //变化成什么样 -> 当元素出来(显示)

    .fade-leave{} .fade-leave-active{} //变成成什么样 -> 当元素离开(消失)

    钩子函数:

    + beforeEnter(el){

                        console.log('动画enter之前');

                    },

                    enter(el){

                        console.log('动画enter进入');

                    },

                    afterEnter(el){

                        console.log('动画进入之后');

                        el.style.background='blue';

                    },

                    beforeLeave(el){

                        console.log('动画leave之前');

                    },

                    leave(el){

                        console.log('动画leave');

                    },

                    afterLeave(el){

                        console.log('动画leave之后');

                        el.style.background='red';

                    }

                  + <transition name="fade"

                        @before-enter="beforeEnter"

                        @enter="enter"

                        @after-enter="afterEnter"

                        @before-leave="beforeLeave"

                        @leave="leave"

                        @after-leave="afterLeave">

                        <p v-show="show"></p>

                    </transition>

    如何animate.css配合用?

    <transition enter-active-class="animated zoomInLeft" leave-active-class="animated zoomOutRight">

            //    <p v-show="show"></p>

            //    <p v-show="show" class='animated></p>

            </transition>

    多个元素运动:

    <transition-group enter-active-class="" leave-active-class="">

        <p :key=""></p>

        <p :key=""></p>

    </transition-group>      

    八.路由

    九.     路由嵌套:

    /user/username

     

    const routes=[

        {path:'/home', component:Home},

        {

            path:'/user',

            component:User,

            children:[  //核心

                {path:'username', component:UserDetail}

            ]

        },

        {path:'*', redirect:'/home'}  //404

    ];

     

    + 路由实例方法:

          router.push({path:'home'});  //直接添加一个路由,表现切换路由,本质往历史记录里面添加一个

          router.replace({path:'news'}) //替换路由,不会往历史记录里面添加

      ------------------------------------------

    十.状态管理

    Vuex核心概念:

    • The state tree:单一状态树,一个对象就包含全部的应用层级状态。每个应用仅包含一个 store 实例。单状态树让我们能够直接地定位任一特定的状态片段,在调试的过程中也能轻易地取得整个当前应用状态的快照。
    • Getters: 用来从 store 获取 Vue 组件数据。
    • Mutators: 事件处理器用来驱动状态的变化。
    • Actions: 可以给组件使用的函数,以此用来驱动事件处理器 mutations

    Vuex工作机制:                        

       用户操作触发action à派发Mutation事件à Mutation触发状态改变àstate触发视图渲染 (单项数据流 类似redux)

    创建vuex store:

    import Vue from 'vue';

    import Vuex from 'vuex';

    Vue.use(Vuex);

    // 需要维护的状态

    const state = {

      notes: [],

      activeNote: {},

      show: ''

    };

    const mutations = {

      // 初始化 state

      INIT_STORE(state, data) {

        state.notes = data.notes,

        state.show = data.show;

        state.activeNote = data.activeNote;

      },

      // 新增笔记

      NEW_NOTE(state) {

        var newNote = {

          id: +new Date(),

          title: '',

          content: '',

          favorite: false

        };

        state.notes.push(newNote);

        state.activeNote = newNote;

      },

      // 修改笔记

      EDIT_NOTE(state, note) {

        state.activeNote = note;

        // 修改原始数据

        for (var i = 0; i < state.notes.length; i++) {

          if(state.notes[i].id === note.id){

            state.notes[i] = note;

            break;

          }

        };

      },

      // 删除笔记

      DELETE_NOTE(state) {

        state.notes.$remove(state.activeNote);

        state.activeNote = state.notes[0] || {};

      },

      // 切换笔记的收藏与取消收藏

      TOGGLE_FAVORITE(state) {

        state.activeNote.favorite = !state.activeNote.favorite;

      },

      // 切换显示数据列表类型:全部 or 收藏

      SET_SHOW_ALL(state, show){

        state.show = show;

        // 切换数据展示,需要同步更新 activeNote

        if(show === 'favorite'){

          state.activeNote = state.notes.filter(note => note.favorite)[0] || {};

        }else{

          state.activeNote = state.notes[0] || {};

        }

      },

      // 设置当前激活的笔记

      SET_ACTIVE_NOTE(state, note) {

        state.activeNote = note;

      }

    };

    export default new Vuex.Store({

      state,

      mutations

    });

    创建vuex action

    即自定义各种action类型:

    function makeAction(type) {

      return ({ dispatch }, ...args) => dispatch(type, ...args);

    };

    const initNote = {

      id: +new Date(),

      title: '我的笔记',

      content: '第一篇笔记内容',

      favorite: false

    };

    // 模拟初始化数据

    const initData = {

      show: 'all',

      notes: [initNote],

      activeNote: initNote

    };

    export const initStore = ({ dispatch }) => {

      dispatch('INIT_STORE', initData);

    };

    // 更新当前activeNote对象

    export const updateActiveNote = makeAction('SET_ACTIVE_NOTE');

    // 添加一个note对象

    export const newNote = makeAction('NEW_NOTE');

    // 删除一个note对象

    export const deleteNote = makeAction('DELETE_NOTE');

    export const toggleFavorite = makeAction('TOGGLE_FAVORITE');

    export const editNote = makeAction('EDIT_NOTE');

    // 更新列表展示

    export const updateShow = makeAction('SET_SHOW_ALL');

    创建 Vuex Getters

    // 获取 noteList,这里将会根据 state.show 的状态做数据过滤

    export const filteredNotes = (state) => {

      if(state.show === 'all'){

        return state.notes || {};

      }else if(state.show === 'favorite'){

        return state.notes.filter(note => note.favorite) || {};

      }

    };

    // 获取列表展示状态 : all or favorite

    export const show = (state) => {

      return state.show;

    };

    // 获取当前激活 note

    export const activeNote = (state) => {

      return state.activeNote;

    };

    以上就是我们 Vuex 的所有逻辑了,在定下了我们需要完成的功能之后,接下来就是只需要在组件中去调用 action 来实现对应的功能了。

    十一.  路由  vue-router

    import VueRouter from 'vue-router';

    import VueResource from 'vue-resource';

    // 路由模块和HTTP模块

    Vue.use(VueResource);

    Vue.use(VueRouter);

    const router = new VueRouter();

    router.map({

      '/index': {

        component: App

      },

      ‘/index/home’{

      Component:Home

    }

    });

    router.redirect({

      '*': '/index'

    });

    router.start(App, '#app');

    十二.  生命周期

    beforeCreate(创建前),

    created(创建后),

    beforeMount(载入前),

    mounted(载入后),

    beforeUpdate(更新前),

    updated(更新后),

    beforeDestroy(销毁前),

    destroyed(销毁后)

    十三.   项目打包

    1、修改config里面的index.js里面的productionSourceMap为false,默认情况是true(true代表打包环境是开发环境,可以进行调试;false表示生产环境,正式上线的)

    2.在cmd里面运行npm run build,(运行的是build里面的build.js文件)

    生成的包放在dist下面

    而后在node上调试需要express

  • 相关阅读:
    Largest Rectangle in Histogram
    Valid Sudoku
    Set Matrix Zeroes
    Unique Paths
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Path Sum II
    Path Sum
    Validate Binary Search Tree
    新手程序员 e
  • 原文地址:https://www.cnblogs.com/jlliu/p/7823116.html
Copyright © 2020-2023  润新知