Vue模板语法

简介: Vue模板语法

3. Vue 模板语法

差值表达式

指令

事件绑定

属性绑定

样式绑定

分支循环结构

3.1 指令

1.什么是指令?

指令的本质就是自定义属性

指令的格式:以v-开始(例如:v-clock)

2. v-cloak指令用法

差值表达式存在的问题:“闪动“-连续刷新页面会出现先弹出{{msg}之后在替换成值的情况。

如何解决该问题:使用v-cloak指令

原理:先隐藏,替换好值之后在显示最终的值

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>02 v-cloak</title>
    <style>
        [v-cloak] {
            display: none;
        }
    </style>
</head>
<body>
    <div id="app">
        <div v-cloak>{{msg}}</div>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        /* 
        v-cloak指令的用法
            1. 提供样式:
             [v-cloak] {
             display: none;
             }
            2. 在差值表达式所在的标签中添加v-cloak指令
        */
        var vm = new Vue({
            el: '#app',
            data: {
                msg: 'Hello Vue'
            }
        });
    </script>
</body>
</html>

3. 数据绑定指令

v-text 填充纯文本

相比插值表达式更加简洁

v-html 填充HTML片段

存在安全问题

本网站内部数据可以使用,来自第三方的数据不可使用

v-pre 填充原始信息

显示原始信息,跳过编译过程

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>02 v-cloak</title>
    <style>
        [v-cloak] {
            display: none;
        }
    </style>
</head>
<body>
    <div id="app">
        <div v-cloak>{{msg}}</div>
        <div v-text=msg></div>
        <div v-html=msg1></div>
        <div v-pre>{{跳过编译过程输出内容}}</div>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                msg: 'Hello Vue',
                msg1:'<h1>HTML</h1>'
            }
        });
    </script>
</body>
</html>

4.数据响应式

如何理解响应式

html5中的响应式(屏幕尺寸的变化导致样式的变化)

数据的响应式(数据的变化导致页面内容的变化)

什么是数据绑定

数据绑定:将数据团填充到标签中

v-once 只编译一次

显示内容之后不再具有响应式功能

<body>
    <div id="app">
        <div v-cloak>{{msg}}</div>
        <div v-once>{{msg1}}</div>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        /* 
           v-once的应用场景:如果显示的信息后续不需要修改,可以使用v-once,提高性能
        */
        var vm = new Vue({
            el: '#app',
            data: {
                msg: 'Hello Vue',
                msg1:'nihao'
            }
        });
    </script>
</body>

3.2 双向数据绑定

v-model指令用法:在表单控件或者组件上创建双向绑定

示例代码如下:

<body>
    <div id="app">
        <div>{{msg}}</div>
        <div>
            <input type="text" v-model="msg">
        </div>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                msg: 'Hello Vue'
            }
        });
    </script>
</body>

MVVM设计思想

M(model)

V (View)

VM(View-Model)

3.3 事件绑定

Vue如何处理事件与实践函数的调用方式:

v-on指令用法 简写模式:@

<input type='button' v-on:click='num++'>
//如下为简写样式,把v-on改成了@
<input type='button' @click='num++'>

事件函数的调用方式

直接绑定函数名称

<button v-on:click='say'>Hello</button>

事件绑定调用函数

<button v-on:click='say()'>Hello</button>

v-on 指令与实践函数的调用方式示例代码如下:

<body>
    <div id="app">
        <div>{{num}}</div>
        <button v-on:click='num++'>点击1</button>
        <button @click='num++'>点击2</button>
        <button @click='handle'>点击3</button>
        <button @click='handle()'>点击4</button>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        // 事件绑定
        var vm = new Vue({
            el: '#app',
            data: {
                num: 0
            },
            methods:{
                handle:function(){
                    // this是Vue的实例对象
                    this.num++;
                }
            }
        });
    </script>
</body>

事件函数参数传递

普通参数和事件参数

示例代码如下:

<body>
    <div id="app">
        <div>{{num}}</div>
        <!-- 方式一:直接绑定函数名称 -->
        <button @click='handle1'>点击1</button>
        <!-- 方式二:事件绑定调用函数 -->
        <button @click='handle2(123,456,$event)'>点击2</button>
        <!-- $event为事件对象是固定的 -->
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        /* 事件绑定 - 参数传递
        1.如果事件直接绑定函数名称,那么默认会传递事件对象作为事件函数的第一个参数
        2.如果事件绑定函数调用,那么事件对象必须作为最后一个参数显示传递
        */
        var vm = new Vue({
            el: '#app',
            data: {
                num: 0
            },
            methods: {
                /* 按钮2 */
                handle2: function (event) {
                    console.log(p1, p2);
                    console.log(event.target.innerHTML)
                    this.num++; // this是Vue的实例对象
                },
                /* 按钮1 */
                handle1: function (event) {
                    console.log(event.target.innerHTML)
                    this.num++; // this是Vue的实例对象
                }
            }
        });
    </script>
</body>

事件修饰符

.stop 阻止冒泡

.prevent 阻止默认事件

示例代码如下:

<body>
    <div id="app">
        <div>{{num}}</div>
        <!-- 事件绑定调用函数 -->
        <div @click='handle1($event)'>
            <!-- .stop 阻止冒泡 -->
            <button @click.stop='handle2($event)'>点击</button>
        </div>
        <div>
            <!-- .prevent阻止默认事件 -->
            <a @click.prevent='handle3($event)' href="www.baidu.com">百度</a>
        </div>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                num: 0
            },
            methods: {
                handle1: function (event) {
                    this.num++; // this是Vue的实例对象
                },
                /* 按钮 */
                handle2: function (event) {},
                handle3: function (event) {}
            }
        });
    </script>
</body>

按键修饰符

.enter 回车键

.delete 删除键

示例代码如下:

<body>
    <div id="app">
        <form action="">
            用户名:<input type="text" v-model='uname' v-on:keyup.delete='clearContent'><br>
            密码:<input type="text" v-model='pwd' v-on:keyup.delete='clearContent'><br>
            <!-- v-on:.click.keyup.enter='handleSubmit'的意思是点击按钮或者敲击回车键都可提交 -->
            <input type="button" value="提交" v-on:.click.keyup.enter='handleSubmit'>
        </form>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                uname: '',
                pwd: ''
            },
            methods: {
                clearContent: function () {
                    this.uname = '',
                        this.pwd = '';
                },
                handleSubmit: function () {
                    console.log(this.uname, this.pwd)
                },
            }
        });
    </script>
</body>

自定义按键修饰符

全局 config.keyCodes对象

示例代码如下:

<body>
    <div id="app">
        <form action="">
            用户名:<input type="text" v-model='info' v-on:keyup.a='handle1'><br>
        </form>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        /* 
            事件绑定 - 自定义按键修饰符
            规则:自定义按键修饰符名字是自定义的,但是对应的值必须是按键对应的event.keyCode值
        */
        Vue.config.keyCodes.a = 65
        var vm = new Vue({
            el: '#app',
            data: {
                info: ''
            },
            methods: {
                handle1: function (event) {
                    console.log(event.keyCode)
                }
            }
        });
    </script>
</body>

3.4 属性绑定

1. Vue如何动态处理属性?

v-bind指令用法

<body>
    <div id="app">
        <!-- 标准写法如下:v-bind:-->
        <!-- <a v-bind:href="url" id="a">{{msg1}}</a> -->
        <!-- 简写方法如下:':'-->
        <a :href="url" id="a">{{msg1}}</a>
        <button v-on:click='handle'>切换</button>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        /* 属性绑定 */
        var a = document.getElementById("a")
        var vm = new Vue({
            el: '#app',
            data: {
                url: 'http://www.baidu.com',
                msg1: '百度',
            },
            methods: {
                handle: function () {
                    this.url = 'http://www.change.tm';
                    this.msg1 = '启嘉网'
                }
            }
        })
    </script>
</body>

2. v-model的底层实现原理分析

<body>
  <div id="app">
      <div>{{msg}}</div>
      <input type="text" v-bind:value='msg' v-on:input='handle'>
      <!-- 这一句就省略了下面的handle方法 -->
      <input type="text" v-bind:value='msg' v-on:input='msg=$event.target.value'>
      <!-- v-model 方法最简便 -->
      <input type="text" v-model='msg'>
  </div>
  <script src="js/vue.min.js"></script>
  <script>
      /* v-model的本质 */
      var vm = new Vue({
          el: '#app',
          data: {
              msg: 'hello'
          },
          methods: {
              handle: function (event) {
                  // 使用输入域中的最新的数据覆盖原来的数据
                  this.msg = event.target.value
              }
          }
      })
  </script>
</body>

3.5 样式绑定

1. class样式处理

对象语法

<div v-bind:class="{active:isActive}"></div>

示例代码如下:

<style>
        .active {
            border: 2px black solid;
            width: 100px;
            height: 100px;
        }
        .error {
            background-color: darkmagenta;
        }
</style>
<body>
    <div id="app">
        <div v-bind:class="{active:isActive,error:isError}">测试内容</div>
        <button v-on:click='handle'>切换</button>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        /* 样式绑定 */
        var vm = new Vue({
            el: '#app',
            data: {
                isActive: true,
                isError: true
            },
            methods: {
                handle: function (event) {
                    // 控制isActive的值在true和false之间进行切换
                    this.isActive = !this.isActive;
                    this.isError = !this.isError;
                }
            }
        })
    </script>
</body>

数组语法

<div  v-bind:class="[activeClass,errorClass]"></div>

数组语法修改样式示例代码如下:

  <style>
        .active {
            border: 2px black solid;
            width: 100px;
            height: 100px;
        }
        .error {
            background-color: darkmagenta;
        }
    </style>
<body>
    <div id="app">
        <div v-bind:class="[activeClass,errorClass]">测试内容</div>
        <button v-on:click='handle'>切换</button>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        /* 样式绑定 */
        var vm = new Vue({
            el: '#app',
            data: {
                activeClass: 'active',
                errorClass: 'error'
            },
            methods: {
                handle: function (event) {
                    //直接置空修改样式
                    this.errorClass = '';
                }
            }
        })
    </script>
</body>

样式绑定 - 细节处理:

(1)对象绑定和数字绑定可以结合使用

(2)class绑定的值可以简化操作

(3)默认的class如何处理?答案是:默认的class会保留

上述三点的测试代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>16 样式绑定-细节处理</title>
    <style>
        .active {
            border: 2px black solid;
            width: 100px;
            height: 100px;
        }
        .error {
            background-color: darkmagenta;
        }
        .test {
            color: darkorange;
        }
        .base{
            font-size: 24px;
        }
    </style>
</head>
<body>
    <div id="app">
        <!-- 细节一:对象绑定和数组绑定可以结合使用 -->
        <div v-bind:class="[activeClass,errorClass,{test:isTest}]">测试内容</div>
        <!-- 细节二:class绑定的值的简化操作--数组和对象都可简化 -->
        <div v-bind:class="arrClasses"></div>
        <div v-bind:class="objClasses">对象样式简化操作</div>
       <!-- 细节三:默认的class如何处理?答案是:默认的class会保留 -->
        <div class="base" v-bind:class="objClasses">默认的class</div>
        <button v-on:click='handle'>切换</button>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        /* 样式绑定 */
        var vm = new Vue({
            el: '#app',
            data: {
                activeClass: 'active',
                errorClass: 'error',
                isTest: true,
                arrClasses: ['active', 'error'],
                objClasses: {
                    active: true,
                    test: true
                }
            },
            methods: {
                handle: function (event) {
                    this.errorClass = '';
                }
            }
        })
    </script>
</body>
</html>

2. style(内联)样式处理

对象语法

<div v-bind:style="{color:activecolor,fontsize:fontsize}"></div>

数组语法

<div v-bind:style="[basestyle,overridingStyles]"></div>

style(内联)样式处理的对象语法和数组语法如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>16 样式绑定-细节处理</title>
</head>
<body>
    <div id="app">
        <!-- 对象语法 -->
        <div v-bind:style='{border:borderStyle,width:widthStyle,height:heightStyle}'></div>
        <div v-bind:style='objStyle'></div>
        <!-- 数组语法: -->
        <div v-bind:style='[objStyle,overridingStyles]'></div>
        <button v-on:click='handle'>切换</button>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        /* 样式绑定 */
        var vm = new Vue({
            el: '#app',
            data: {
                borderStyle: '2px solid black',
                widthStyle: '100px',
                heightStyle: '100px',
                objStyle: {
                    border: '5px solid green',
                    width: '200px',
                    height: '200px'
                },
                overridingStyles: {
                    /* overridingStyles会覆盖之前原有的样式 */
                    border: '3px solid red',
                    backgroundColor: 'pink'
                }
            },
            methods: {
                handle: function (event) {
                    this.widthStyle = '200px';
                    this.objStyle.width = '100px'
                }
            }
        })
    </script>
</body>
</html>

3.6 分支循环结构

1. 分支结构

v-if

v-else

v-else-if

v-show

2. v-if与v-show的区别

v-if控制元素是否渲染到页面

v-show控制元素是否显示(已经渲染到了页面)

示例代码如下:

<body>
    <div id="app">
        <div v-if='score>=90'>优秀</div>
        <div v-else-if='score<90&&score>=80'>良好</div>
        <div v-else-if='score<80&&score>=60'>及格</div>
        <div v-else>差</div>
        <div v-show='flag'>测试v-show</div>
        <button v-on:click='handle'>点击切换</button>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        /* 
            分支结构
            v-show的原理:控制元素样式是否显示 display:none
        */
        var vm = new Vue({
            el: '#app',
            data: {
                score:20,
                flag:false
            },
            methods: {
                handle:function(){
                    this.flag=!this.flag
                }
            }
        });
    </script>
</body>

3. 循环结构

v-for遍历数组

key的作用:帮助Vue区分不同的元素,从而提高性能

<body>
    <div id="app">
        <div>水果列表</div>
        <ul>
            <li v-for='item in fruits'>{{item}}</li>
            <!-- 可以加上索引 -->
            <li v-for='(item,index) in fruits'>{{item + '---' + index}}</li>
            <!-- key 的作用:帮助Vue区分不同的元素,从而提高性能 -->
            <li :key='item.id' v-for='item in myFruits'>
                <span>{{item.ename}}</span>
                <span>------</span>
                <span>{{item.cname}}</span>
            </li>
        </ul>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        /* 循环结构 */
        var vm = new Vue({
            el: '#app',
            data: {
                fruits: ['apple', 'banana', 'orange'],
                myFruits: [{
                    id: 1,
                    ename: 'apple',
                    cname: '苹果'
                }, {
                    id: 2,
                    ename: 'banana',
                    cname: '香蕉'
                }, {
                    id: 3,
                    ename: 'orange',
                    cname: '橘子'
                }]
            },
        });
    </script>
</body>

4. v-if和v-for结合使用

v-for遍历对象

<div v-for='(value,key,index) in object'></div>

v-if和v-for结合使用

语法如下:

<div v-if='value == 12' v-for='(value,key,index) in object'></div>

示例代码如下:

<body>
    <div id="app">
        <div v-if='value== "张三"' v-for='(value,key,index) in object'>{{value + '---' + key + '---' + index}}</div>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        /* 
            v-if和v-for结合使用
        */
        var vm = new Vue({
            el: '#app',
            data: {
                object : {
                    name: '张三',
                    age: 19,
                    hobby: 'eat'
                }
            }
        });
    </script>
</body>
不苒
+关注
目录
打赏
0
0
0
0
2
分享
相关文章
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
178 0
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
149 17
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
79 1
如何高效实现 vue 文件批量下载及相关操作技巧
在Vue项目中,实现文件批量下载是常见需求。例如文档管理系统或图片库应用中,用户可能需要一次性下载多个文件。本文介绍了三种技术方案:1) 使用`file-saver`和`jszip`插件在前端打包文件为ZIP并下载;2) 借助后端接口完成文件压缩与传输;3) 使用`StreamSaver`解决大文件下载问题。同时,通过在线教育平台的实例详细说明了前后端的具体实现步骤,帮助开发者根据项目需求选择合适方案。
99 0
Vue1.0常用语法
var vm = new Vue({   el: "选择器", 挂载到页面的那个元素里,即确定vue的作用范围 外部可通过vm.$el访问,得到的是一个原生dom元素,可进行对应操作   a: '', //自定义属性 外部可通过vm.$options访问   data: {
3630 0
|
3月前
|
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
362 4
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
234 77
Vue 文件批量下载组件封装完整使用方法及优化方案解析
本文详细介绍了批量下载功能的技术实现与组件封装方案。主要包括两种实现方式:**前端打包方案(基于file-saver和jszip)** 和 **后端打包方案**。前者通过前端直接将文件打包为ZIP下载,适合小文件场景;后者由后端生成ZIP文件流返回,适用于大文件或大量文件下载。同时,提供了可复用的Vue组件`BatchDownload`,支持进度条、失败提示等功能。此外,还扩展了下载进度监控和断点续传等高级功能,并针对跨域、性能优化及用户体验改进提出了建议。可根据实际需求选择合适方案并快速集成到项目中。
175 17
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等