Vue笔记

作者: 小努努努力 | 来源:发表于2019-05-08 11:01 被阅读0次

    一:环境搭建

        1.安装node.js

        2.cnpm 下载包

          地址:http://npm.taobao.org/

          安装cnpm:

          npm install -g cnpm --registry=https://registry.npm.taobao.org

        3.搭建vue的开发环境:

          https://cn.vuejs.org/v2/guide/installation.html

          1、必须要安装nodejs

          2、搭建vue的开发环境 ,安装vue的脚手架工具  官方命令行工具

            npm install --global vue-cli  /  cnpm install --global vue-cli (此命令只需要执行一次)

          3、创建项目  必须cd到对应的一个项目里面

            vue init webpack vue-demo01

            cd  vue-demo01

            cnpm install  /  npm install          如果创建项目的时候没有报错,这一步可以省略。如果报错了  cd到项目里面运行  cnpm install  /  npm install

            npm run dev

          4、另一种创建项目的方式  (推荐)  安装文件比较简洁

            vue init webpack-simple vuedemo02

            cd  vuedemo02

            cnpm install  /  npm install       

            npm run dev

    二:运行说明

        1、cd 到demo里面

        如:cd vuedemo

        2、安装依赖:

        cnpm install 

        3、运行项目

        npm run dev

    三:基本代码

        {{msg}}---双大括号是插值表达式,小胡子语法。

        el:'#app'---表示Vue实例控制页面上那个区域。

        data:{ }---存放el中需要用到的数据

        methods:{}---方法,定义当前实例所有可用的方法

    四:Vue指令

        1:v-cloak---解决在网络延迟时插值表达式闪烁问题

          用法:

          <p v-cloak>{{msg}}</p>

          <style>[v-cloak]{display: none;}</style>

        2: v-text---默认没有闪烁问题,会覆盖元素中原本的内容

          用法:

          <p v-text="msg">被v-text覆盖的内容</p>

        3: v-html---双大括号的方式会将数据解释为纯文本,而非HTML。为了输出真正的HTML,可以用v-html指令。它等同于JS的innerHtml属性 

          <p v-html="msg2">1212112</p>

        4: v-bind---绑定属性的指令,简写为 :要绑定的属性。只能实现单向绑定,从M自动绑定到V

          <input type="button" value="按钮" v-bind:title="mytitle + '123'">

        5:v-on---事件绑定机制,简写为 @

          <input type="button" value="按钮" v-on:click="show">

          <input type="button" value="按钮" @:click="show">

        6:v-model---实现表单元素和Model数据双向绑定,只能运用在表单元素中。input(radio, text, address, email....)  select    checkbox  textarea

          <input type="text" v-model="msg"> 

        7:v-for---循环数组

          循环普通数组

            <p v-for="item in list">{{item}}</p>

            <li v-for="(item, i) in list">索引:{{i}} --- 姓名:{{item.name}} --- 年龄:{{item.age}}</li>

            循环对象数组

            <p v-for="(user, i) in list">Id:{{ user.id }} --- 名字:{{ user.name }} --- 索引:{{i}}</p>

            循环遍历对象身上的属性

            <div v-for="(val, key, i) in userInfo">{{val}} --- {{key}} --- {{i}}</div>

            迭代数字

            <p v-for="count in 10">这是第 {{ count }} 次循环</p>

            Key属性使用---循环时,key属性只能使用number和string,须使用 v-bind 属性绑定的形式,指定 key 的值

            <p v-for="item in list" :key="item.id">

              <input type="checkbox">{{item.id}} --- {{item.name}}

            </p>

        8. v-if---每次都会重新删除或者创建元素,有更高的切换消耗

            <h3 v-if="flag">这是用v-if控制的元素</h3>

        9. v-show---每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式

            <h3 v-show="flag">这是用v-show控制的元素</h3>

            如果元素涉及到频繁的切换,最好不要使用 v-if, 而是推荐使用 v-show

            如果元素可能永远也不会被显示出来被用户看到,则推荐使用 v-if

    五:事件修饰符

        .stop --停止--阻止冒泡

        .prevent --阻止--阻止默认行为

        .capture --捕获--实现捕获触发事件机制   

        .self--自己--实现只有点击当前元素时候,才会触发事件处理函数

        .once--一次--只触发一次事件函数

    六:Vue中样式

        1.普通样式

          <p class="red thin">一</p>

        2.传递一个数组,注意: 这里的 class 需要使用  v-bind 做数据绑定

          <p :class="['thin', 'italic']">传递一个数组</p>

        3.数组中使用三元表达式

          <p :class="['thin','italic',flag?'active':'']">数组中使用三元表达式</p>

        4.数组中嵌套对象

          <p :class="['red', 'thin', {'active': isactive}]">数组中嵌套对象</p>

        5.直接使用对象

          <p :class="classObj">直接使用对象</p>

          <p :class="red:true, italic:true, active:true,thin:true">直接使用对象</p>

        6.使用内联样式

          直接在元素上通过 `:style` 的形式,书写样式对象

          <p :style="{color: 'red', 'font-size': '40px'}">这是一个善良的p</p>

          <p :style="[ styleObj1, styleObj2, styleObj3]">这是一个p</p>

          <script>

            var vm = new Vue({

              el: '#app',

              data: {

                flag: true,

                classObj: { red: true, thin: true, italic: false, active: false }

              },

              methods: {}

            });

            </script>

            <style>

            .red {color: red;  }

            .thin {font-weight: 200;}

            .italic {font-style: italic;  }

            .active {letter-spacing: 0.5em;  }

            </style>

    七:键盘修饰符以及自定义键盘修饰符

          通过Vue.config.keyCodes.名称 = 按键值来自定义案件修饰符的别名:

          Vue.config.keyCodes.f2 = 113;

          <input type="text" v-model="name" @keyup.f2="add">

    八:过滤器定义

        Vue.filter('过滤器的名称', function(){})

        过滤器中的 function ,第一个参数,已经被规定死了,永远都是 过滤器 管道符前面 传递过来的数据

        Vue.filter('过滤器的名称', function (data) {

          return data + '123'

          })

        过滤器调用时候的格式    {{ name | 过滤器的名称 }}

        私有过滤器:

          1. HTML元素:

          ```

          <td>{{item.ctime | dataFormat('yyyy-mm-dd')}}</td>

          ```

          2. 私有 `filters` 定义方式:

          ```

          filters: { // 私有局部过滤器,只能在 当前 VM 对象所控制的 View 区域进行使用

              dataFormat(input, pattern = "") { // 在参数列表中 通过 pattern="" 来指定形参默认值,防止报错

                var dt = new Date(input);

                // 获取年月日

                var y = dt.getFullYear();

                var m = (dt.getMonth() + 1).toString().padStart(2, '0');

                var d = dt.getDate().toString().padStart(2, '0');

                // 如果 传递进来的字符串类型,转为小写之后,等于 yyyy-mm-dd,那么就返回 年-月-日

                // 否则,就返回  年-月-日 时:分:秒

                if (pattern.toLowerCase() === 'yyyy-mm-dd') {

                  return `${y}-${m}-${d}`;

                } else {

                  // 获取时分秒

                  var hh = dt.getHours().toString().padStart(2, '0');

                  var mm = dt.getMinutes().toString().padStart(2, '0');

                  var ss = dt.getSeconds().toString().padStart(2, '0');

                  return `${y}-${m}-${d} ${hh}:${mm}:${ss}`;

                }

              }

            }

          ```

          ### 全局过滤器

          ```

          // 定义一个全局过滤器

          Vue.filter('dataFormat', function (input, pattern = '') {

            var dt = new Date(input);

            // 获取年月日

            var y = dt.getFullYear();

            var m = (dt.getMonth() + 1).toString().padStart(2, '0');

            var d = dt.getDate().toString().padStart(2, '0');

            // 如果 传递进来的字符串类型,转为小写之后,等于 yyyy-mm-dd,那么就返回 年-月-日

            // 否则,就返回  年-月-日 时:分:秒

            if (pattern.toLowerCase() === 'yyyy-mm-dd') {

              return `${y}-${m}-${d}`;

            } else {

              // 获取时分秒

              var hh = dt.getHours().toString().padStart(2, '0');

              var mm = dt.getMinutes().toString().padStart(2, '0');

              var ss = dt.getSeconds().toString().padStart(2, '0');

              return `${y}-${m}-${d} ${hh}:${mm}:${ss}`;

            }

          });

          ```

          > 注意:当有局部和全局两个名称相同的过滤器时候,会以就近原则进行调用,即:局部过滤器优先于全局过滤器被调用!

    九:生命周期函数

        <script>

          // 开始创建 Vue 实例,得到 ViewModel

          var vm = new Vue({

            el: '#app',

            data: {

              msg: 'ok'

            },

            methods: {

              show() {

                console.log('执行了show方法')

              }

            },

            beforeCreate() { 创建前//  这是我们遇到的第一个生命周期函数,表示实例完全被创建出来之前,会执行它

              // console.log(this.msg)

              // this.show()

              //刚初始化一个vue空的实例对象,这时候,这个对象身上,只有默认的一些生命周期函数和默认事件,其他东西都未创建

              // 注意: 在 beforeCreate 生命周期函数执行的时候,data 和 methods 中的 数据都还没有没初始化

            },

            created() { 创建// 这是遇到的第二个生命周期函数

              // console.log(this.msg)

              // this.show()

              //  在 created 中,data 和 methods 都已经被初始化好了!

              // 如果要调用 methods 中的方法,或者操作 data 中的数据,最早,只能在 created 中操作

            },

            beforeMount() { 即将挂载// 这是遇到的第3个生命周期函数,表示模板已经在内存中编译完成了,但是尚未把模板渲染到页面中,此时,页面还是旧的。

              // console.log(document.getElementById('h3').innerText)

              // 在 beforeMount 执行的时候,页面中的元素,还没有被真正替换过来,只是之前写的一些模板字符串

            },

            mounted() { 挂载// 这是遇到的第4个生命周期函数,表示,内存中的模板,已经真实的挂载到了页面中,用户已经可以看到渲染好的页面了

              // console.log(document.getElementById('h3').innerText)

              // 注意: mounted 是 实例创建期间的最后一个生命周期函数,当执行完 mounted 就表示,实例已经被完全创建好了,此时,如果没有其它操作的话,这个实例,就静静的 躺在我们的内存中,一动不动

              //肉果要通过某些插件操作页面上的DOM节点,最早要在mounted中进行。只要执行力mounted,就表示整个Vue实例已经初始化完毕,

              //此时,组件已经脱离了创建阶段,进入到运行阶段。

            },

            // 接下来的是运行中的两个事件

            beforeUpdate() { 更新前// 这时候,表示 我们的界面还没有被更新【数据被更新了吗?  数据肯定被更新了】

              /* console.log('界面上元素的内容:' + document.getElementById('h3').innerText)

              console.log('data 中的 msg 数据是:' + this.msg) */

              // 得出结论: 当执行 beforeUpdate 的时候,页面中的显示的数据,还是旧的,此时 data 数据是最新的,页面尚未和 最新的数据保持同步

            },

            updated() { 更新

              console.log('界面上元素的内容:' + document.getElementById('h3').innerText)

              console.log('data 中的 msg 数据是:' + this.msg)

              // updated 事件执行的时候,页面和 data 数据已经保持同步了,都是最新的

            },

            beforeDestroy(){  销毁前

            /*  当执行beforeDest钩子函数的时候,Vue实例就已经从运行阶段,进入到销毁阶段;

            当执行beforeDe的时候,实例身上所有data和所有methods,以及过滤器,指令...都处于可用状态,此时,还没有真正执行销毁过程 */

            },

            destroyed(){ 完全销毁

              /* 当执行到destroyed函数的时候,组件已经完全销毁了,此时组件中所有的数据,方法,指令,过滤器,都已经不可用了。 */

            }

          });

        </script>

    十:使用vue-resource请求数据的步骤

            1.安装vue-resource模块,加上--save

              npm install vue-resource --save /  cnpm install vue-resource --save

            2.在main.js引入vue-resource 

              import VueResource from 'vue-resource';

            3.在main.js引入Vue.use(VueResource);

              Vue.use(VueResource);

            4.在组件里面直接使用 

              this.$http.get(地址).then(function(){

              })

              <template>

                <!-- 所有的内容要被根节点包含起来 -->

                <div id="home">

                    首页组件

                    <button @click="getData()">请求数据</button>

                        <hr>

                    <br>

                    <ul>

                        <li v-for="item in list">

                            {{item.title}}

                        </li>

                    </ul>

                </div>

            </template>

              <script>

                    export default{

                        data(){

                            return {

                                msg:'我是一个首页组件msg',

                                flag:true,

                                list:[]

                            }

                        },

                        methods:{

                            getData(){

                                    //请求数据

                                    var api='http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=1';

                                    this.$http.get(api).then((response)=>{

                                        console.log(response);

                                        //注意this指向

                                        this.list=response.body.result;

                                    },function(err){

                                            console.log(err);

                                    })

                            }

                        },

                        mounted(){  /*生命周期函数*/

                                this.getData();

                        }

                    }

                </script>

    十一:使用vue-axios请求数据

          1.安装vue-axios       

            cnpm install axios --save 

          2.哪里使用哪里引入

            import Axios from 'axios'

            <script>

                import Axios from 'axios';

                export default{

                    data(){

                        return {

                            list:[]

                        }

                    },

                    methods:{

                        getData(){

                            var api='http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=1';

                            Axios.get(api).then((response)=>{

                                this.list=response.data.result;

                            }).catch((error)=>{

                                console.log(error);

                            })

                        }

                    },

                    mounted(){  /*生命周期函数*/

                        this.getData();

                    }

                }

            </script>

    十二:组件使用

          1.在script标签内引入组件

          2. 在components内挂载组件 

          3.在模板中使用组件

          <template>

              <div id="app">

                <v-home></v-home><!--在模板中使用组件 -->

                <v-news></v-news>

              </div>

            </template>

            <script>

              //引入组件

              import Home from './components/Home.vue';

              import News from './components/News.vue';

              export default {

                  data () {

                    return {

                    msg:'你好vue'

                    }

                  },

                  components:{  /*前面的组件名称不能和html标签一样*/

                    'v-home':Home, //挂载组件

                    'v-news':News

                  }

                }

            </script>

    十三:父组件给子组件传值 父组件给子组件传方法

          1. 父组件调用字组件时候,绑定动态属性

            <v-header :title="title"></v-header>

          2.在子组件里面通过props接收父组件传过来的数据

            props:['title']     

          父组件代码: 

                    <template>

                        <div id="home">

                            <v-header :title="title" :homemsg='msg'  :run="run"  :home="this"></v-header>

                            <hr>

                            首页组件

                        </div>

                    </template>

                    <script>

                        import Header from './Header.vue';

                        export default{

                            data(){

                                return {

                                  msg:'我是一个home组件',

                                  title:'首页111'

                                }

                            },

                            components:{

                                'v-header':Header

                            },

                            methods:{

                                run(data){

                                  alert('我是Home组件的run方法'+data);

                                }

                            }

                        }

                    </script>

          子组件代码:

                    <template>

                        <div>

                            <h2>我是头部组件--{{title}}---{{homemsg}}</h2>

                            <button @click="run('123')">执行父组件的方法</button>

                            <button @click="getParent()">获取父组件的数据和方法</button>

                        </div>

                    </template>

                    <script>

                    export default{

                        data(){

                            return{

                                msg:'子组件的msg'

                            }

                        },

                        methods:{

                            getParent(){

                                this.home.run()

                            }

                        },

                        props:['title','homemsg','run','home']

                    }

                    </script> 

    十四:路由使用

            1.安装

              npm install vue-router  --save  / cnpm install vue-router  --save

            2、引入并 Vue.use(VueRouter)  (main.js)

              import VueRouter from 'vue-router'

              Vue.use(VueRouter)

            3、配置路由  下面四个在main.js里面

              1、创建组件 引入组件

              2、定义路由  (建议复制s)

                  const routes = [

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

                  { path: '/news', component: News },

                  <!-- 属性1 是 path, 表示监听 哪个路由链接地址;

                      属性2 是 component, 表示,如果 路由是前面匹配到的 path ,则展示 component 属性对应的那个组件

                      注意: component 的属性值,必须是一个 组件的模板对象, 不能是 组件的引用名称

                  -->

                  { path: '*', redirect: '/home' }  <!-- 默认跳转路由 -->

                ]

              3、实例化VueRouter

                  const router = new VueRouter({

                    routes // (缩写)相当于 routes: routes

                  })

              4、挂载

                  new Vue({

                    el: '#app',

                    router,

                    render: h => h(App)

                  })

              5 、根组件的模板里面放上这句话 

              <!-- vue-router提供的占位符 将来,路由规则,匹配到的组件,就会展示到这个 router-view 中去-->

              <router-view></router-view>     

              <!-- <router-view></router-view> 外层可以包裹 <transition>设置动画-->

              6、路由跳转

                <!--router默认渲染为a标签,使用tag属性可以更改默默认a标签 -->

                <router-link to="/foo" tag="span">Go to Foo</router-link>

                <router-link to="/bar">Go to Bar</router-link>

              7.1.this.$router.go(val) => 在history记录中前进或者后退val步,当val为0时刷新当前页面。

              2.this.$router.push(path) => 在history栈中添加一条新的记录。 

    十五:动画

          1.使用transition元素,把需要被动画控制的元素包裹起来

            <transition mode="out-in"> <!-- mode="out-in是动画先出后进" -->

              <p>被控制元素</p>

            </transition>

          2.自定义两组样式,来控制 transition 内部的元素实现动画

            <style>

                /* v-enter 【这是一个时间点】 是进入之前,元素的起始状态,此时还没有开始进入 */

                /* v-leave-to 【这是一个时间点】 是动画离开之后,离开的终止状态,此时,元素 动画已经结束了 */

                .v-enter,

                .v-leave-to {

                  opacity: 0;

                  transform: translateX(150px);

                }

                /* v-enter-active 【入场动画的时间段】 */

                /* v-leave-active 【离场动画的时间段】 */

                .v-enter-active,

                .v-leave-active{

                  transition: all 0.8s ease;

                }

              </style>

            3.修改动画v-前缀    transition加入name属性

              <transition name="my"> 

                <p>被控制元素</p>

              </transition>

              样式里面v-改完自定义名字

              <style>

                .my-enter,.my-leave-to{opacity: 0;}

                .my-enter-active,.my-leave-active{transition: all 0.8s ease;}

              </style>

            4.使用animate库实现动画,用npm安装看api

              <transition enter-active-class="animated bounceIn"

                        leave-active-class="animated bounceOut">

                <h3 v-if="flag">这是一个H3</h3>

              </transition>

            5.动画钩子函数 

              +1:定义 transition 组件以及三个钩子函数:

                  <div id="app">

                      <input type="button" value="切换动画" @click="isshow = !isshow">

                      <transition

                      @before-enter="beforeEnter"

                      @enter="enter"

                      @after-enter="afterEnter">

                        <div v-if="isshow" class="show">OK</div>

                      </transition>

                    </div>

                +2. 定义三个 methods 钩子方法

                    <script>

                    methods: {

                      // 注意: 动画钩子函数的第一个参数:el,表示 要执行动画的那个DOM元素,是个原生的 JS DOM对象

                      // 大家可以认为 , el 是通过 document.getElementById('') 方式获取到的原生JS DOM对象

                      beforeEnter(el){

                        // beforeEnter 表示动画入场之前,此时,动画尚未开始,可以 在 beforeEnter 中,设置元素开始动画之前的起始样式

                        // 设置小球开始动画之前的,起始位置

                        el.style.transform = "translate(0, 0)"

                      },

                      enter(el, done){

                        // 这句话,没有实际的作用,但是,如果不写,出不来动画效果;

                        // 可以认为 el.offsetWidth 会强制动画刷新

                        el.offsetWidth

                        // enter 表示动画 开始之后的样式,这里,可以设置小球完成动画之后的,结束状态

                        el.style.transform = "translate(150px, 450px)"

                        el.style.transition = 'all 1s ease'

                        // 这里的 done, 起始就是 afterEnter 这个函数,也就是说:done 是 afterEnter 函数的引用

                        done()

                      },

                      afterEnter(el){

                        // 动画完成之后,会调用 afterEnter

                        // console.log('ok')

                        this.flag = !this.flag

                      }

                    }

                    </script>

    十六:使用ref获取DOM元素和组件

          <h3 id="myh3" ref="myh3">哈哈哈, 今天天气太好了!!!</h3>     

          <script>

          methods:{

            console.log(this.$refs.myh3.innerText

          }

          </script>

    相关文章

      网友评论

          本文标题:Vue笔记

          本文链接:https://www.haomeiwen.com/subject/zyjeoqtx.html