美文网首页
vue练习(上)

vue练习(上)

作者: 6e5e50574d74 | 来源:发表于2018-10-25 19:56 被阅读0次

    1.vue-mvc

    <body>
        <div id="app">
            {{msg}}
        </div>
    </body>
    <script src="../base/vue.js"></script>
    <script>
        //vue 使用 
        //模型就是数据
        var data = {
            msg:'zsq'
        }
        //每一个库  框架都有实例
        new Vue({//m-->c-->v
            el:'#app',//模板的挂载
            data:{//实例身上的数据
                msg:data
            }
        })
    </script>
    
    

    2.vue-mvvm

    /*MVVM
            M--------Model     数据
            V--------View      将数据的变化情况反映到视图上
            VM-------ViewModel 视图模型
            区别: vm  和  c
            VM和V之间的关系更加的直接  紧密
     */
       //不通过Model直接更改数据然后渲染
       new Vue({
           el:'#app' ,//挂载
           data:{
               msg:'helsdafdasflo world~'
           }
       })
    

    3.深入响应式原理

      var data ={
                student:'zsq'
            }
            var vm = new Vue({
                el:'#app' ,//挂载
                data:{
                    aa:data.student
                }
            })
    
    //不要在data选项的外面去定义数据
    let _data = {
            student:'兵哥'
        };
        let str = 'bingge'
        Object.defineProperty(_data,'student',{
            get(){
                return str
            },
            set(val){
               str = val ;
            }
        })
        console.log(_data)
        _data.student = '你好吗'
    

    4.v-"for"

    <body>
        <div id="app">
            <ul>
                //两个参数
                <li v-for=' (v,i) in list'>
                    {{v}}---{{i+1}}
                </li>
            </ul>
        </div>
    </body>
    </html>
    <script src="../base/vue.js"></script>
    <script>
        //1. 上面的东西是假的  只是模板
        //2. vue中的directive 作用: 操作DOM 
        //列表渲染
        new Vue({
            el:'#app',
            data:{
                list:['苹果','香蕉','橘子']
            }
        })
    </script>
    

    浏览器显示


    图片.png
    <body>
        <div id="app">
            <ul>
                //三个参数写法
                <li v-for=' (v,key,i) in person'>
                    {{v}}---{{key}}----{{i+1}}
                </li>
            </ul>
        </div>
    </body>
    <script src="../base/vue.js"></script>
    <script>
        new Vue({
            el:'#app',
            data:{
                person:{
                    name:'张帅旗',
                    age:18,
                    sex:'man'
                }
            }
        })
    </script>
    
    image.png

    5.实例"data"里的数据类型可以是任意类型的

    <body>
        <div id="app">
              {{str}} <br> 
              {{num}} <br> 
              {{bool}} <br> 
              {{und===undefined?1:2}} <br> 
              {{nun}} <br> 
              {{obj}} <br> 
              {{arr}} <br> 
              {{fn}} <br> 
        </div>
        <script src="../base/vue.js"></script>
        <script>
          var vm = new Vue({
              el:"#app",
              data:{
                  str:'str',
                  num:123,
                  bool:true,
                  und:undefined,
                  nun:null,
                  obj:{x:1},
                  arr:[1,2,3],
                  fn:function(){alert(1)}
              }
          })
        </script>
    </body>
    
    image.png

    6.v-bind在循环中绑定数据;简写方式v-bind===:(冒号)。

    <body>
        <div id="app">
            <ul>
                    <!-- v-bind用法 -->
                <li v-for=' (v,i) in list' :key='i'>
                    {{v}}----{{i}}
                </li>
                    <!-- 循环length为100 -->
                <li  v-for='(n,i) in 100'> 
                    {{n}}--------{{i}}
                </li>
            </ul>
        </div>
    </body>
    <script src="../base/vue.js"></script>
    <script>
        new Vue({
            el:'#app',
            data:{
                list:[1,2,2,3,3,4,4,4]
            }
        })
    </script>
    
    image.png
    <body>
        <div id="app">
            <template v-for='v in list'>
                <p>
                    {{v}}
                </p>
            </template>
        </div>
    </body>
    <script src="../base/vue.js"></script>
    <script>
        new Vue({
            el:'#app',
            data:{
                list:[1,2,2,3,3,4,4,4]
            }
        })
    </script>
    
    image.png

    7.v-on事件修饰符
    1. 我们是用v-on:eventType = '' 来绑定DOM事件
    2. v-on:click=函数的处理程序 只支持简单的js表达式
    3. 简写形式 v-on:click === @click
    4. 我们的原生事件这边都可以使用 dblclick keyup keydown ...
    5. 事件对象e 也是正常使用
    6. 传参数的时候,多个参数中如果有一个是事件对象,我们使用$event来代表事件对象
    7. 按键修饰符: 自定义 写在全局上 Vue.config.keyCodes.zsq= 80

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <style>
        ul{
            padding: 20px;background: rgba(123,31,32,0.5)
        }
    </style>
    <body>
        <div id="app">
          <button v-on:click='msg="张帅旗"'>
              点击
          </button>
          <button v-on:click='num++'>
              点击
          </button>
          <button v-on:click='alert'>
              点击
          </button>
          <button @click='alert'>
              点击
          </button>
          <button @dblclick='alert'>
              双击
          </button>
          {{msg}}
          {{num}}
          <input type="text" @keydown = 'num++'>
          {{num}}
          <button @click = 'event'>
              事件对象
          </button>
          <!-- 传参数 -->
          <button @click = 'arguFun("张帅旗")' >
              传参数
          </button>
          <!-- 需求:传多个参数,并且有一个是事件对象 -->
          <button @click = 'twoArguments("张帅旗",$event)' >
              传两个参数,其中一个是事件对象
          </button>
          <!-- 需求:有一个ul  li    都绑定事件 -->
          <ul @click='ulHandle'>
              <!-- stop -->
              <li @click.stop='liHandle'>
                  事件冒泡
              </li>
          </ul>
          <!-- self -->
          <ul @click.self='ulHandle'>
              <li @click='liHandle'>
                  事件冒泡
              </li>
          </ul>
          <!-- 浏览器的默认行文  表单提交 -->
          <form @submit.prevent = 'formSubmit'>
            <input type="text">
            <input type="submit" value="提交">
          </form>
          <!-- once -->
        <button @click.once = 'num++'>
            once{{num}}
        </button>
        <!-- 按键修饰符 -->
        <input type="text" @keyup.13='inputFun'>
        {{num}}
        <!-- 自定义按键修饰符 -->
        <input type="text" @keyup.yyb='inputFun'>
        {{num}}
    </div>
    <script src="../../base/vue.js"></script>
        <script>
            Vue.config.keyCodes.p = 80 ; //p
            new Vue({
                el:'#app',
                data:{
                    msg:'Vue',
                    num:0
                },
                methods:{//挂着一些方法
                    alert(){
                        alert(1)
                    },
                    event(e){
                        console.log(e)
                    },
                    arguFun(val){
                        alert(val)
                    },
                    twoArguments(val,m){
                        console.log(val);
                        console.log(m)
                    },
                    ulHandle(){
                        alert('ul')
                    },
                    liHandle(){
                        // e.stopPropagation()
                        alert('li')
                    },
                    formSubmit(){
                        alert('表单提交')
                    },
                    inputFun(){
                        this.num++ ;
                    }
                }
            })
        </script>
    </body>
    </html>
    

    8.v-model

    <body>
        <div id="app">
            <input type="text" v-model = 'msg' value="zsq">
            {{msg}}
            <textarea name="" id="" cols="30" rows="10" v-model = 'msg'>你今天是不是傻?</textarea>
            <input type="checkbox" name="" id="" v-model = 'checkboxFlag'>
        </div>
        <script src="../../base/vue.js"></script>
        <script>
            //双向数据绑定指令 v-model 
            /*
                1. 使用 
                2. 作用: 绑定了value,使它和data选项中的数据联系起来 ,原有标签中的value无效
                3. 有限制,只能使用在表单中
            */
            new Vue({
                el:'#app',
                data:{
                    msg:'这里是双向数据绑定的内容',
                    checkboxFlag:true 
                }
            })
        </script>
    </body>
    

    9.v-html标签解析

    <body>
        <div id="app">
            <p>
                {{num}}
            </p>
            <!-- 标签解析  v-html-->
            <div v-html = 'html'></div>
    
            <!-- 属性的绑定  v-bind-->
            <img v-bind:src="src" alt="">
            <!-- 简写 v-bind   : -->
            <img :src="src" alt="">
    
        </div>
        <script src="../../base/vue.js"></script>
        <script>
            /*
                单项数据绑定指令   v-bind
                1. 属性的绑定 
                2. 简写    v-bind   :
    
                标签解析 :  v-html
            */
            new Vue({
                el:'#app',
                data:{
                    num:0,
                    html:'<h3>这里是一个标签</h3>',
                    src:'https://cn.vuejs.org/images/logo.png'
                }
            })
        </script>
    </body>
    
    image.png

    10.v-bind、class

    <style>
        .red{background: red;}
        .blue{background: blue;}
        .yellow{background: yellow;}
    
        .big{
            font-size: 48px;
        }
        .small{
            font-size: 0.5em;
        }
    </style>
    <body>
        <div id="app">
            <!-- 类名也是属性   所以我们使用的是 v-bind  -->
            
            <!-- 1.数组的形式来绑定类名 ? 因为将来我们使用的类名不止一个  数组中的每一项都是支持简单的js表达式的-->
                <!-- <p :class = '[color,(sizeFlag?size:small)]'>
                    这里是类名的绑定
                </p> -->
    
            <!-- 对象的形式  类名: {}  a:b   a 是类名 b是data选项中的开关-->
                <p :class='{"big":sizeFlag,"red":colorFlag}'>
                    这里是类名的绑定
                </p>
          
    
        </div>
        <script src="../../base/vue.js"></script>
        <script>
            //一个复杂的项目其实就是由简单的小功能组成的
            //在vue中,每一个功能的实现,都是遵循这样的步骤的
            //1. 寻找关键数据
            //2.将关键数据与视图建立联系
            // 3.通过控制数据来控制视图效果
            new Vue({
                el:'#app',
                data:{
                    color:'red',
                    size:'big',
                    sizeFlag:true,
                    small:'small',
                    colorFlag:true,
                }
            })
           //v-bind的作用是绑定属性的 id,class,style,src...
           //v-bind:src-> :src
        </script>
    </body>
    
    image.png

    style

    <body>
        <div id="app">
            <!-- 样式的对象形式 -->
           <p :style='{"background":"red","fontSize":"48px"}'>
               这里是样式
           </p>
           <!-- 数组的形式 -->
           <p :style='[bg,width]'>
               这里是样式
           </p>
        </div>
        <script src="../../base/vue.js"></script>
        <script>
           var vm = new Vue({
               el:"#app",
               data:{
                bg:{
                    background:'blue'
                },
                width:{
                    width:'200px'
                }
               }
           })
           //v-bind的作用是绑定属性的 id,class,style,src...
           //v-bind:src-> :src
        </script>
    </body>
    
    image.png

    11.computed计算属性

    <body>
        <div id="app">
            <p> <button @click="num++" >increment</button> </p>
            <p>num: {{num}}</p>
            <p> mnum: {{getMnum()}} </p>
            <p> mnum: {{num*2+1}} </p>
            <p> mnum: {{mnum}} </p>
            <p> onum: {{onum}} </p>
            <hr>
            <p><input type="text" v-model="message"></p>
            <p>message: {{message}}</p>
    
        </div>
        <script src="./base/vue.js"></script>
        <script>
           var vm = new Vue({
               el:"#app",
               data: {
                   message: 'hello world',
                   num:1,
                   mnum:null
               },
               methods: {
                   getMnum () {
                       console.log('getMnum')
                       return this.num*2+1
                   }
               },
               watch: {//可以去监听某个数据的变化
                    // num: function (val,oldVal) {//在初始化的时候不执行
                    //     console.log('watch')
                    //     this.mnum = val*2+1
                    // },
                    num: {
                        immediate: true,//保证初始化的时候也会执行一些回调函数
                        handler: function (val) {
                            this.mnum = val*2+1
                        }
                    }
               },
               computed: {
                   onum: function () {
                       //键名为要新增的属性,在回调函数里建立关系
                       console.log('computed')
                       return this.num * 2 + 1
                   }
               }
           })
           //有如下需求:需要根据现有数据得到一个新的数据,彼此之间有联系
           // 1. 可以使用方法,在方法中返回正确的数据,在模板中使用这个方法
           //  这样的解决方法有问题,当无关数据更改的时候,重新渲染的时候,会重新执行这个方法,虽然没有必要
           // 2. 可以直接在mustache里面写计算的表达式,这样的话,不方便代码复用和维护,而且当无关数据改变的时候,也会受到影响
           // 3. 可以使用watch,先去挂载一个新的数据,然后去监听现有数据,当现有数据改变的时候,去改变新数据
           //   有一点小缺点:逻辑会复杂一些,并且当维护的时候,需要至少更改两个地方
           // 在vue中,提供了一个专门的api:computed(计算属性)
            // 作用:专门复杂,根据一个现有数据去生成一个新数据,并且这两个数据直接会建立永久的关系,并且会建立缓存,当无关数据改变的时候,不会重新计算而是直接使用缓存中的值!!!
        </script>
    </body>
    
    image.png image.png

    相关文章

      网友评论

          本文标题:vue练习(上)

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