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>

输出:

原文地址:https://www.cnblogs.com/feihusurfer/p/12248641.html