zoukankan      html  css  js  c++  java
  • 02 vue数据绑定与指令

    系列文章导航

    01 Vue语法基础

    02 vue数据绑定与指令

    03 vue组件技术

    04 vue单文件组件定义与使用


    1 模板语法

    在标记内通过模板语法:{{}}进行数据的绑定。

    {{}}内支持变量,方法名,计算属性,表达式,不支持语句。

    {{}}将数据解析为纯文本,如果需要解析为html,需要在标记上增加v-html指令。

    2 属性绑定

    在标记上,为标记属性绑定Vue数据时,不允许用模板语法,如下方式是不合法的。

    <!-- 错误写法 -->
    <a href="{{url}}">百度</a>

    属性绑定需要使用vue指令v-bind实现

    v-bind:属性名="data属性"
    :属性名=“data属性”
    <!-- 完整写法 -->
    <a v-bind:href="baidu">百度1</a>
    <!-- 简化写法 -->
    <a :href="baidu">百度1</a>

    3 指令

    3.1 v-bind 用于标签的属性绑定

    v-bind:属性名="data属性"

    :属性名=“data属性” 

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="vue.js" type="text/javascript" charset="utf-8"></script>
        </head>
        <body>
            <div id="app">
             <!-- 完整写法 -->
             <a v-bind:href="baidu">百度1</a>
             <!-- 缩写写法 -->
             <a :href="baidu">百度1</a>
            </div>
            <script type="text/javascript">
                var app = new Vue({
                    // 挂载元素 - 作用范围
                    el: '#app',
                    // vue数据
                    data: {
                        baidu:'http://www.baidu.com'
                    },
    
                });
            </script>
    
        </body>
    </html>

    3.2 v-model 用于表单控件双向绑定

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="vue.js" type="text/javascript" charset="utf-8"></script>
        </head>
        <body>
            <div id="app">
                <div>
                    文本框
                    <div><input v-model="baidu" type="text" /></div>
                    <div>控件值:{{baidu}}</div>
                </div>
                <div>
                    单选框
                    <div>男:<input type="radio" value="男" v-model="sex"></div>
                    <div>女:<input type="radio" value="女" v-model="sex"></div>
                    <div>控件值:{{sex}}</div>
                </div>
                <div>
                    复选框
                    <div>篮球:<input type="checkbox" value="篮球" v-model="loves"></div>
                    <div>足球:<input type="checkbox" value="足球" v-model="loves"></div>
                    <div>羽毛球:<input type="checkbox" value="羽毛球" v-model="loves"></div>
                    <div>控件值:{{loves}}</div>
                </div>
                <div>
                    单选下拉框
                    <div>
                        <select v-model="love">
                            <option value="">请选择</option>
                            <option>篮球</option>
                            <option>足球</option>
                            <option>羽毛球</option>
                        </select>
                    </div>
                    <div>控件值:{{love}}</div>
                </div>
                <div>
                    多选下拉框
                    <div>
                        <select v-model="loves" multiple="multiple">
                            <option value="">请选择</option>
                            <option>篮球</option>
                            <option>足球</option>
                            <option>羽毛球</option>
                        </select>
                    </div>
                    <div>控件值:{{loves}}</div>
                </div>
            </div>
            <script type="text/javascript">
                var app = new Vue({
                    // 挂载元素 - 作用范围
                    el: '#app',
                    // vue数据
                    data: {
                        baidu: 'http://www.baidu.com',
                        sex:'',
                        loves: [],
                        love:''
                    }
                });
            </script>
        </body>
    </html>

    3.3 v-model 的指令修饰符

    .lazy : 当光标离开控件时,才出发变量的数据变更。

    <input v-model.lazy="baidu" type="text" />

    .number : 限定文本框只能输入数值。

    <input v-model.number="baidu" type="text" />

    .trim : 自动去除内容两头的空格符号。

    <input v-model.trim="baidu" type="text" />

    3.4 v-text,v-html

    v-text更新元素的textContent。

    <span v-text="msg"></span>
    <!-- 和下面的一样 -->
    <span>{{msg}}</span>

    v-html 更新元素的innerHtml,会解析HTML代码

    <div v-html="html">{{包含html内的变量}}</div>

    3.5 v-show,v-if,v-else,v-else-if

    v-show 根据表达式的布尔值,切换内容块的display属性值,隐藏或显示

    <h1 v-show="true">Hello1</h1>
    <h1 v-show="false">Hello2</h1>

    v-if 根据表达式的布尔值,渲染或不渲染内容快,添加或移除

    <h1 v-if="true">Hello-1</h1>
    <h1 v-if="false">Hello-2</h1>

    v-else 前一个兄弟元素必须有v-if或者v-else-if,当不成立的时候渲染

    <div v-if="Math.random() > 0.5">
      大于0.5
    </div>
    <div v-else>
      小于或等于0.5
    </div>

    v-else-if 多重if判断,前一兄弟元素必须有 v-if 或 v-else-if

    <div v-if="type === 'A'">
      A
    </div>
    <div v-else-if="type === 'B'">
      B
    </div>
    <div v-else-if="type === 'C'">
      C
    </div>
    <div v-else>
      Not A/B/C
    </div>

    3.6 v-for 迭代数组

        <body>
            <div id="app">
                <!-- 实例1 -->
                <ul id="example-1">
                    <li v-for="item in items">
                        {{ item.message }}
                    </li>
                </ul>
                <!-- 实例2 -->
                <ul id="example-2">
                    <li v-for="(item, index) in items">
                        {{ index }} - {{ item.message }}
                    </li>
                </ul>
                <!-- 实例3 -->
                <ul id="example-3">
                    <li v-for="(item, index) in items2">
                        {{ index }} - {{ item }}
                    </li>
                </ul>
            </div>
            <script type="text/javascript">
                var app = new Vue({
                    // 挂载元素 - 作用范围
                    el: '#app',
                    // vue数据
                    data: {
                        items: [
                            { message: 'Foo' },
                            { message: 'Bar' }
                        ],
                        items2:['a','b','c']
                    }
                });
            </script>
        </body>

    输出结果:

    3.7 v-for 迭代对象

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="vue.js" type="text/javascript" charset="utf-8"></script>
        </head>
        <body>
            <div id="app">
                <!-- 单值循环 -->
                <ul id="v-for-object1" class="demo">
                    <li v-for="value in objName">
                        {{value}}
                    </li>
                </ul>
                <!-- 键值对循环 -->
                <ul id="v-for-object2" class="demo">
                    <template v-for="(v,k) in objName">
                        <!-- 两层属性不循环 -->
                        <li v-if="k != 'parents'">
                            {{ v + ' - ' + k }}
                        </li>
                        <!-- 两层属性单独循环 -->
                        <li v-else>
                            遍历内层对象
                            <ul>
                                <li v-for="(v,k) in v">
                                    {{ v + ' - ' + k }}
                                </li>
                            </ul>
                        </li>
                    </template>
                </ul>
            </div>
            <script type="text/javascript">
                var app = new Vue({
                    // 挂载元素 - 作用范围
                    el: '#app',
                    // vue数据
                    data: {
                        objName: {
                            title: 'How to do lists in Vue',
                            author: 'Jane Doe',
                            publishedAt: '2016-04-10',
                            method1: function() {
                                return "123";
                            },
                            parents:{
                                a:'123',
                                b:'456'
                            }
                        }
                    }
                });
            </script>
        </body>
    </html>

    输出结果:

    3.8 v-for 迭代模板

    templete标签在实际渲染的时候元素是不显示在网页上的,如果v-for过程中要迭代生成多个标签内容,可以把v-for语法加载template上。

    <ul>
      <template v-for="item in items">
        <li>{{ item.msg }}</li>
        <li class="divider" role="presentation"></li>
      </template>
    </ul>

    3.9 v-on 绑定事件

    绑定事件监听器。事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。

    用在普通元素上时,只能监听原生 DOM 事件。用在自定义元素组件上时,也可以监听子组件触发的自定义事件。

    事件绑定用的:v-on:事件名="触发的方法名"

    <!-- 方法事件处理器 -->
    <button v-on:click="doThis"></button>
    <!-- 内联事件处理器,需要传递参数时用 -->
    <button v-on:click="doThat('hello', $event)"></button>

    简写代码:@事件名="触发的方法名"

    <!-- 方法处理器 -->
    <button @click="doThis"></button>

    代码实例:

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="vue.js" type="text/javascript" charset="utf-8"></script>
        </head>
        <body>
            <div id="app">
                <input type="button" value="点击我1" v-on:click="handleClick1" />
                <input type="button" value="点击我1 - 简写" @click="handleClick1" />
                <input type="button" value="点击我2" v-on:click="handleClick2($event,'123')" />
                <input type="button" value="点击我2 - 简写" @click="handleClick2($event,'123')" />
            </div>
            <script type="text/javascript">
                var app = new Vue({
                    // 挂载元素 - 作用范围
                    el: '#app',
                    // vue数据
                    data: {},
                    methods: {
                        handleClick1: function(e) {
                            console.info(e);
                        },
                        handleClick2: function(e, arg) {
                            console.info(e);
                            console.info(arg);
                        }
                    }
                });
            </script>
        </body>
    </html>

    输出结果:

    在子组件上监听自定义事件 (当子组件触发“my-event”时将调用事件处理器handleThis):

    <my-component @my-event="handleThis"></my-component>

    3.9 v-on 修饰符

    <!-- 停止冒泡 -->
    <button @click.stop="doThis"></button>
    <!-- 阻止默认行为 -->
    <button @click.prevent="doThis"></button>
    <!--  串联修饰符 -->
    <button @click.stop.prevent="doThis"></button>
    <!-- 键修饰符,键别名 -->
    <input @keyup.enter="onEnter">
    <!-- 键修饰符,键代码 -->
    <input @keyup.13="onEnter">
    <!-- 点击回调只会触发一次 -->
    <button v-on:click.once="doThis"></button>

    3.9 v-once 单次渲染

    只渲染元素和组件一次。随后的变量值变更不会重新渲染。

    <input type="text" v-model="title" />
    <div v-once>
        {{title}}
    </div>

    3.10 v-bind绑定class

    通过数据项的布尔值决定是否引用某个class属性。

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="vue.js" type="text/javascript" charset="utf-8"></script>
            <style type="text/css">
                .active {
                    color: blue;
                    font-weight: 900;
                }
                .textError {
                    color: red;
                    font-weight: 900;
                }
            </style>
        </head>
        <body>
            <div id="app">
                <!-- 样式名:布尔数据 ,当数据值为true时绑定该样式 -->
                <div class="myClass" :class="{active:isActive,textError:isError}">普通方式</div>
                <!-- 对象形式 - 对象属性名是要绑定的样式,属性值为true时绑定 -->
                <div :class="classObj">对象形式</div>
                <!-- 数组形式 - 数组元素是数据,数据值代表要绑定的样式  -->
                <div  :class="[activeClass,errorClass]">数组形式</div>
                <!-- 数据形式 - 含表达式 -->
                <div :class="[isActive?activeClass:'',errorClass]">三元数组</div>
                <div :class="[{active:isActive},errorClass]">普通方式和数组形式混合</div>
            </div>
            <script type="text/javascript">
                var app = new Vue({
                    // 挂载元素 - 作用范围
                    el: '#app',
                    // vue数据
                    data: {
                        isActive: false,
                        isError: true,
                        classObj:{
                            active:true,
                            textError:false
                        },
                        activeClass:'active',
                        errorClass:'textError'
                    }
                });
            </script>
        </body>
    </html>

    运行结果:

    3.10 v-bind绑定style

    当样式中包含中划线时,必须用单引号引起来。

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script src="vue.js" type="text/javascript" charset="utf-8"></script>
        </head>
        <body>
            <div id="app">
                <!-- 对象属性是样式名,属性值是样式值,和style的原始值合并  -->
                <div style="font-family: '新宋体'" :style="{color:activeColor,fontSize:fontSize,'margin-top':marginTop}">对象形式</div>
                <!-- 样式对象属性是样式名,属性值是样式值  -->
                <div :style="styleObj1">样式对象方式</div>
                <!-- 数组方式,数组元素是多个样式对象 -->
                <div :style="[styleObj1,styleObj2]">数组方式</div>
            </div>
            <script type="text/javascript">
                var app = new Vue({
                    // 挂载元素 - 作用范围
                    el: '#app',
                    // vue数据
                    data: {
                        activeColor: 'blue',
                        fontSize: '30px',
    marginTop:'30px', styleObj1:{ color:'red', fontSize:'30px' }, styleObj2:{ border:'1px solid green'
    } } }); </script> </body> </html>

    输出:

  • 相关阅读:
    转: android emulator 命令详解
    ubuntu 环境变量PATH的修改
    ubuntu创建、删除文件及文件夹,强制清空回收站方法
    51单片机的P0口工作原理详细讲解
    smartconfig配置模式
    (网卡)混杂模式
    Scrapy shell使用
    Splash 笔记
    Lua一般都用来干什么,有什么优点
    python dict转json并保存文件
  • 原文地址:https://www.cnblogs.com/feihusurfer/p/12248641.html
Copyright © 2011-2022 走看看