zoukankan      html  css  js  c++  java
  • vue学习(二)Vue常用指令

    2 Vue常用指令

    1. vue的使用要从创建Vue对象开始
       var vm = new Vue();
       
    2. 创建vue对象的时候,需要传递参数,是json对象,json对象对象必须至少有两个属性成员
       var vm = new Vue({
         el:"#app",
    	 	 data: {
             数据变量:"变量值",
             数据变量:"变量值",
             数据变量:"变量值",
         },
       });
       
       el:设置vue可以操作的html内容范围,值一般就是css的id选择器。
       data: 保存vue.js中要显示到html页面的数据。
       
    3. vue.js要控制器的内容外围,必须先通过id来设置。
      <div id="app">
          <h1>{{message}}</h1>
          <p>{{message}}</p>
      </div>
    

    2.1 vue用法

    <body>
    <div id="app">
            {{name}}    // 模板语法
    </div>
    
    <script>
        const app = new Vue({    // 实例化
            el:'#app',           // 必须要有 指定作用域
            data:{
                name:'alex'      // 数据
            }
        })
    </script>
    </body>
    

    2.2 v-html;v-text

    # v-text
    <body>
    <div id="app">
        <p v-text="name"></p>   #### v-text="name"
    </div>
    
    <script>
        const app = new Vue({
            el:'#app',
            data:{
                name:'alex'
            }
        })
    </script>
    </body>
    
    # v-text和v-html
    <body>
    <div id="app">
        <p v-text="name"></p>         #### v-text
        <div v-html="hobby"></div>    #### v-html
    </div>
    
    <script>
        const app = new Vue({
            el:'#app',
            data:{
                name:'alex',
                hobby:`<ul>
                            <li>篮球</li>
                            <li>女</li>
                            <li>足球</li>
                       </ul>`
            }
        })
    </script>
    </body>
    

    2.3 v-for

    <body>
    
    <div id="app">
        <div v-for="items in vegetables">{{items}}</div>  ### 重点
        <div v-for="items in fruit">{{items.name}}的价格是{{items.price}}</div> ### 重点
    </div>
    
    <script>
        const app = new Vue({
            el:'#app',
            data:{      // 数据
                vegetables:['茄子', '西红柿', '豆角'],
    
                fruit:[{
                    name:'西瓜',
                    price:'1.99'},
                    {
                        name:'桃子',
                        price:'1.88'
                    }
                ]
            }
        })
    </script>
    </body>
    

    2.4 v-if,v-else-if,v-else

    <body>
    <div id="app">
        <div v-if="role=='student'">
            学生登录系统
        </div>
        <div v-else-if="role == 'teacher'">
            老师登录系统
        </div>
        <div v-else>
            <h1>请使用正确的身份</h1>
        </div>
    </div>
    
    <script>
        const app = new Vue({
            el:'#app',
            data:({
                role:'student'
            })
        })
    </script>
    </body>
    
    # 浏览器console控制台。切换app.role='teacher'来实现v-else-if和v-else的实现
    
    // 在html里只显示页面显示标签(说明添加的是appendChild)
    

    2.5 v-show

    <body>
    <div id="app">
        <p v-show="is_show">Vue中v-show指令</p>
    </div>
    
    <script>
        const app = new Vue({
            el:'#app',
            data:({
                is_show:true    # 改变这里
            })
        })
    </script>
    // 页面标签显示是  display 来显示
    </body>
    

    2.6 v-bind 简写 :

    2.6.1 绑定a标签

    我们之前的写法

    <div id="app">
        <a href="https://www.baidu.com">去百度</a>
    </div>
    

    vue中v-bind指令

    <body>
    <div id="app">
        <a v-bind:href="link">去百度</a> ☆☆☆☆☆☆
    </div>
    
    <script>
        const app = new Vue({
            el:'#app',
            data:({
                link:'https://www.baidu.com'☆☆☆☆☆☆
            })
        })
    </script>
    </body>
    
    

    2.6.2 绑定样式

    之前的写法

    <head>
     <style>
            .jump{
                text-decoration: none;
            }
        </style>
    </head>
    
    <body>
    <div id="app">
        <a href="https://www.baidu.com" class="jump">去百度</a>
    </div>
    </body>
    

    vue中v-bind指令

    <body>
    <div id="app">
        <a v-bind:href="link" :class="{jump:isActive}">去百度</a>    ### v-bind简写是‘:’,绑定样式{}
    </div>
    
    <script>
        const app = new Vue({
            el:'#app',
            data:({
                link:'https://www.baidu.com',
                isActive:true
            })
        })
    </script>
    </body>
    

    2.7 v-on 简写 @

    
    <body>
    // 两者选一个
    <div id="app">
        <button v-on:click="my_click" @mouseenter="my_enter" @mouseleave="my_leave">点我给你想要的</button>
    </div>
    ==================================================
    <div id="app">
        <button v-on="{click:my_click,mouseenter:my_enter,mouseleave:my_leave}">点我给你想要的</button>
    </div>
    ==================================================
    <script>
        const app = new Vue({
            el:'#app',
            methods:{
                my_click:function () {
                    alert('123')
                },
                my_enter:function () {
                    console.log('移入打印')
                },
                my_leave:function () {
                    console.log('移出打印')
                }
            }
        })
    </script>
    </body>
    

    2.8 小demo-给Alex加点料

    壹:

        <style>
            #name{
                 150px;
                height: 150px;
                border: solid 1px black;
            }
            .green{
                background-color: green;
                color: white;
            }
        </style>
    </head>
    <body>
    
    <div id="app">
        <div id="name" :class="{green:isActive}">              # 绑定样式
            <p v-text="name"></p>
        </div>
        <button v-on:click="my_click">点我改变颜色</button>
    </div>
    
    <script>
        const app = new Vue({
            el:'#app',
            data:{
              name:'Alex',
                isActive:true
            },
            methods:{
                my_click:function () {
                    this.isActive = ! this.isActive
                }
            }
        })
    </script>
    </body>
    

    贰:

    <body>
    
    <div id="app">
        <button @click="my_click">点我显示</button>
        <h1 v-show="is_show">晓强</h1>
    </div>
    
    <script>
        const app = new Vue({
            el:'#app',
            data:{
                is_show:false
            },
            methods:{
                my_click:function () {
                    this.is_show = ! this.is_show
                }
            }
        })
    </script>
    </body>
    

    2.9 v-model 双向绑定

    <body>
    
    <div id="app">
        <p>请输入你的姓名</p>
        <input type="text" v-model="name">
        {{name}}
        <br>
        <p>请选择你的性别</p>
        <input type="checkbox" value="男" v-model="sex">
        <input type="checkbox" value="女" v-model="sex">
        {{sex}}
        <br>
        <p>单选</p>
        <select name="" id="1" v-model="boy_friend">
            <option value="林俊杰0">林俊杰0</option>
            <option value="林俊杰1">林俊杰1</option>
            <option value="林俊杰2">林俊杰2</option>
        </select>
    
        {{boy_friend}}
        <br>
        <p>多选</p>
        <select name="" id="2" v-model="girl_friend" multiple>
            <option value="林志玲0">林志玲0</option>
            <option value="林志玲1">林志玲1</option>
            <option value="林志玲2">林志玲2</option>
        </select>
        {{girl_friend}}
        <br>
        <p>textarea</p>
        <textarea name="" id="" cols="30" rows="10" v-model="my_textarea">
    
        </textarea>
        {{my_textarea}}
    </div>
    
    <script>
        const app = new Vue({
            el:'#app',
            data:{
                name:'xiaoqiang',
                sex:[],
                boy_friend:[],
                girl_friend:[],
                my_textarea:''
    
            }
    
        })
    </script>
    </body>
    

    2.10 指令修饰符

    2.10.1 懒惰lazy/去空格(trim)

    2.10.2 number显示数据类型

    2.10.3 pre标签显示多个空格

    <body>
    <div id="app">
        <p>lazy回车之后显示</p>
        <input type="text" v-model.lazy="name">
        <input type="text" v-model.lazy.trim="name">    # 去空格
        {{name}}
        <hr>
        <p>number显示数据类型</p>
        <input type="text" v-model.number="phone">
        {{typeof phone}}
    
        <hr>
         <p>pre标签显示多个空格</p>
        <input type="text" v-model="pre">
        <pre>{{pre}}</pre>
    </div>
    
    <script>
        const app = new Vue({
            el:'#app',
           data:{
                name:'',
                phone:null,
                pre:'',
           }
    
        })
    </script>
    </body>
    

    2.11 计算指令 computed

    # 效果是字符串拼接
    <body>
    <div id="app">
        <table border="1">
            <thead>
            <tr>
                <th>学科</th>
                <th>成绩</th>
            </tr>
            </thead>
            <tbody>
            <tr>
                <td>python基础</td>
                <td><input type="text" v-model="python"></td>
            </tr>
            <tr>
                <td>前端</td>
                <td><input type="text" v-model="web"></td>
            </tr>
            <tr>
                <td>django</td>
                <td><input type="text" v-model="django"></td>
            </tr>
            <tr>
                <td>总分</td>
                <td>{{python + web +django}}</td>
            </tr>
            <tr>
                <td>平均分</td>
                <td>{{(python + web + django)/3}}</td>
            </tr>
            </tbody>
        </table>
    </div>
    
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                python:100,
                web:100,
                django:100
    
            }
        })
    </script>
    </body>
    
            <tr>
                <td>python基础</td>
                <td><input type="text" v-model.number="python"></td>
            </tr>
    
    
    <body>
    <div id="app">
        <table border="1">
            <thead>
            <tr>
                <th>学科</th>
                <th>成绩</th>
            </tr>
            </thead>
            <tbody>
            <tr>
                <td>python基础</td>
                <td><input type="text" v-model.number="python"></td>
            </tr>
            <tr>
                <td>前端</td>
                <td><input type="text" v-model.number="web"></td>
            </tr>
            <tr>
                <td>django</td>
                <td><input type="text" v-model.number="django"></td>
            </tr>
            <tr>
                <td>总分</td>
                <td>{{python + web +django}}</td>
            </tr>
            <tr>
                <td>平均分</td>
                <td>{{(python + web + django)/3}}</td>
            </tr>
            </tbody>
        </table>
    </div>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                python:100,
                web:100,
                django:100
    
            }
        })
    </script>
    </body>
    
    • 在继续改,我们在总分和平均分的时候算的太麻烦了,怎么办呢,引出computed
    # computed版本------对比没有注释掉的部分
    <body>
    <div id="app">
    
        <table border="1">
            <thead>
            <!--<tr>-->
                <!--<th>学科</th>-->
                <!--<th>成绩</th>-->
            <!--</tr>-->
            </thead>
            <tbody>
            <!--<tr>-->
                <!--<td>python基础</td>-->
                <!--<td><input type="text" v-model.number="python"></td>-->
            <!--</tr>-->
            <!--<tr>-->
                <!--<td>前端</td>-->
                <!--<td><input type="text" v-model.number="web"></td>-->
            <!--</tr>-->
            <!--<tr>-->
                <!--<td>django</td>-->
                <!--<td><input type="text" v-model.number="django"></td>-->
            <!--</tr>-->
            <tr>
                <td>总分</td>
                <td>{{sum_num}}</td>
            </tr>
            <tr>
                <td>平均分</td>
                <td>{{(python + web + django)/3}}</td>
            </tr>
            </tbody>
        </table>
    </div>
    <script>
    //    const app = new Vue({
    //        el: '#app',
    //        data: {
    //            python:100,
    //            web:100,
    //            django:100
    //        },
            computed:{
                sum_num:function () {
                    return this.python + this.web + this.django
                },
                avg:function () {
                    return this.sum_num / 3
                }
            }
        })
    </script>
    </body>
    

    例:

    # getter
    <div id="app">
        {{ reverseMsg }}
        <button @click="handleClick">改变</button>
    </div>
    
    <script>
        var app = new Vue({
            el:'#app',
            data:{
                msg:'hello word'
            },
            methods:{
                handleClick:function () {
                    this.msg = '我在学习vue的计算属性'
                }
            },
            computed:{
                // computed 默认只有getter方法
                // 计算属性最大的优点:产生缓存 如果数据没有发生改变 直接从缓存中取
                reverseMsg:function () {
                   return this.msg.split('').reverse().join('')
                }
        }
    
        })
    </script>
    

    # setter
    <div id="app1">
        {{content}}
        <input type="text" v-model="content" @input="handleInput">
        <button @click="handleClick">改变</button>
    </div>
    
    <script>
        var app = new Vue({
            el:'#app1',
            data:{
               msg:''
            },
            methods:{
               handleInput:function (event) {
                   const {value} = event.target;
                   this.content = value
               },
                handleClick:function(){
                   console.log(this.content)       // 点击改变打印值
                }
            },
            computed:{
              content:{
                  set:function (newV) {
    //                  console.log(newV)
                      this.msg = newV
                  },
                  get:function () {
                      return this.msg
                  }
              }
        }
    
        })
    

    2.12 自定义指令 directive

    • 模板
    Vue.directive('mingzi',function (el,bindding) {});
    
    • 步骤
    ① 搭建vue
    ② 新建自定义指令
    ③ 绑定个盒子
    ④ 操作
    

    ① 搭建vue

    <body>
    <div id="app"> </div>
    
    <script>
        const app = new Vue({
            el:'#app',
        })
    </script>
    </body>
    

    ② 新建自定义指令

    <!--<body>-->
    <!--<div id="app">-->
    
    <!--</div>-->
    
    <!--<script>-->
        Vue.directive('boxs',function (el,bindding) { });
        <!--const app = new Vue({-->
            <!--el:'#app',-->
    
        <!--})-->
    <!--</script>-->
    <!--</body>-->
    

    ③ 绑定个盒子,加个样式和数据

    <!--<body>-->
    
    <!--<div id="app">-->
        <div class="box" v-boxs="text"></div>
    <!--</div>-->
    
    <!--<script>-->
        <!--Vue.directive('boxs',function (el,bindding) {-->
            <!---->
        <!--});-->
    
        <!--const app = new Vue({-->
            <!--el:'#app',-->
            data:{
                text:true
            }
        })
    //</script>
    //</body>
    
    • Vue.directive里打印
        Vue.directive('boxs',function (el,bindding) {
            console.log(el);           // 绑定指定的元素(div)
            console.log(bindding)      // 自定义指令的对象(.value是一个值)
        });
    

    ④ 操作--盒子位置变化的demo

    <body>
    
    <div id="app">
        <div class="box" v-boxs="text"></div>
    </div>
    
    <script>
        Vue.directive('boxs',function (el,bindding) {
            if(bindding.value){
                el.style.position = 'fixed';
                el.style.bottom = 0;
                el.style.right = 0
    
            }else{
                el.style.position = 'static';
            }
        });
    
        const app = new Vue({
            el:'#app',
            data:{
                text:true
            }
    
        })
    </script>
    </body>
    
    • 看下图,我们所写的都会显示那么我们研究一下标红的地方--modifiers

    • 我们怎么改呢

    <div id="app">
        <div class="box" v-boxs.right.top="text"></div> ☆☆☆☆☆
    </div>
    
    <script>
        Vue.directive('boxs',function (el,bindding) {
            console.log(el);
            console.log(bindding);
            console.log(bindding.modifiers); ☆☆☆☆☆
    
            ......
    
    • 盒子变换位置
    <body>
    
    <div id="app">
        <!--<div class="box" v-boxs.right.top="text"></div>-->
        <div class="box" v-boxs.left.bottom="text"></div>
    </div>
    
    <script>
        Vue.directive('boxs',function (el,bindding) {
            console.log(el);
            console.log(bindding);
            console.log(bindding.modifiers);
    
            let position = bindding.modifiers;    ☆☆☆☆☆☆
            if(bindding.value){
                el.style.position = 'fixed';
    //            el.style.bottom = 0;
    //            el.style.right = 0
                for(let key in position){         ☆☆☆☆☆☆
                    el.style[key]=0
                }
            }else{
                el.style.position = 'static';
            }
        });
    
        const app = new Vue({
            el:'#app',
            data:{
                text:true
            }
    
        })
    </script>
    

    2.13 获取DOM操作

    <body>
    <div id="app">
        <div ref="my_box">    ☆☆☆☆☆ref
            <p>获取DOM</p>
        </div>
    
        <button @click="my_click">点我给盒子改变样式</button>
    </div>
    
    <script>
        const app = new Vue({
            el:'#app',
            methods:{
                my_click:function () {
                    this.$refs.my_box.style.color = 'red'    ☆☆☆☆☆refs/my_box
                }
            }
        })
    </script>
    </body>
    
    

    2.14 watch 监听

    # 基础的数据类型
    <div id="app">
        <input type="text" v-model="msg">
        {{ msg }}
    </div>
    
    <script>
        var app = new Vue({
            el:'#app',
            data:{
                msg:''
            },
            watch:{
                msg:function (newV,oldV) {
                    console.log(newV,oldV)
                }
            }
        })
    </script>
    

    # 复杂的数据类型 object Array
    
    <div id="app">
        {{ stus[0].name }}
        <button @click="stus[0].name='Tom'">改变</button>
    </div>
    
    <script>
        // 对于普通的数据类型 可以用watch直接监听 对于复杂的数据类型 obj/array 要深度监视
        var app = new Vue({
            el:'#app',
            data:{
                stus:[{name:'jack'}]
            },
            watch:{
                'stus':{
                    deep:true,
                    handler:function (newV,oldV) {                   # 重点
                        console.log(newV[0].name)
                    }
                }
            }
    
        })
    </script>
    
  • 相关阅读:
    String前后去掉空格、option只能定义value值吗?还能添加什么值。dom和Jquery对象转换。
    JsonObject没有fromObject、idea引入maven有红线没依赖、JsonObject maven 依赖包
    json几个小例子
    [极客大挑战 2019]PHP1
    栈溢出原理笔记(一)
    CentOS7怎么安装图形界面
    快速搭建WordPress博客
    Mac 安装Mysql 之 Sqlservice 区别
    Metasploit-初篇
    Windows To Go 制作详解
  • 原文地址:https://www.cnblogs.com/a438842265/p/9713806.html
Copyright © 2011-2022 走看看