• 第三篇:Vue指令


    Vue指令

    1、文本指令相关

    • v-*是Vue指令,会被vue解析,v-text="num"中的num是变量(指令是有限的,不可以自定义)
    • v-text是原样输出渲染内容,渲染控制的标签自身内容会被替换掉(

      123

      会被num替换)
    • v-html可以解析渲染html语法的内容
    <div id="app">
        <!-- 插值表达式 -->
        <p>{{ msg }}</p>
        <!-- eg:原文本会被msg替换 -->
        <p v-text='msg'>原文本</p>
        <!-- 可以解析带html标签的文本信息 -->
        <p v-html='msg'></p>
        <!-- v-once控制的标签只能被赋值一次 -->
        <p v-once>{{ msg }}</p>
    </div>
    <script type="text/javascript">
        // 指令: 出现在html标签中可以被vue解析处理的全局属性
        new Vue({
            el: "#app",
            data: {
                msg: "message"
            }
        })
    </script>
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>文本指令</title>
    </head>
    <body>
    <div id="app">
        <p>{{ num | add(100) }}</p>
        <p v-text="num"></p>
        <p v-text="num">123</p>
        <p v-text="info"></p>
        <p v-html="info"></p>
    </div>
    </body>
    <script src="vue.min.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                num: 10,
                info: '<i style="color: red">info内容</i>'
            },
            filters: {
                add: function (a, b) {
                    return a + b;
                }
            },
     
        })
    </script>
    </html>
    

    js基本数据类型:字符串,数字,布尔,undefined

    2、斗篷指令

    由于html代码是从上往下加载的,导致刚开始并不会渲染到数据,例如:{{num}},页面只会显示{{num}}

    虽然加载很快,但肉眼可见的有一瞬间的闪烁,为了避免这个问题,我们可以采取:

    • 将vue.js在顶部导入,但不推荐,因为官方推荐在最后面导入
    • 使用斗篷指令
    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            /**
            1)属性选择器,会将v-cloak属性所在的标签隐藏
            2)当vue环境加载后,会将v-cloak属性解析移除,所以内容{{ num }}就会显示出来
            3)而现在vue已经准备完毕,所以用户会直接看到数值10,而不会看到 页面从{{ num }}闪烁成数值10
            */
            [v-cloak] {
                display: none;
            }
        </style>
    </head>
    <body>
        <div id="app" v-cloak>
            <p v-on:click="fn">{{ num }}</p>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        // v-cloak:避免屏幕闪烁
        new Vue({
            el: '#app',
            data: {
                num: 10
            },
            methods: {
                fn () {
                    if (this.num <= 0) {
                        return false;
                    }
                    this.num -= 2
                }
            }
        })
    </script>
    </html>
    

    3、属性指令

    1)语法:v-bind:属性名="变量"

    2)针对不同属性,使用方式稍微有一丢丢区别

    • i)自定义属性以及title这些,直接赋值的,使用方式如下(t是变量,'o'是常量)

      <p v-bind:title="t" v-bind:owen="'o'">段落</p>
      
    • ii)class属性(重点):

      绑定的变量:值可以为一个类名 "p1",也可以为多个类名 "p1 p2"

      绑定的数组:数组的每一个成员都是一个变量

      绑定的字典:key就是类名,value是决定该类名是否起作用(类似开关)

    • iii)style属性(了解):

      绑定的变量:值是一个字典

    <!-- 给自定义全局属性绑定变量 -->
    <p v-bind:abc="abc"></p>
    <!-- 以原字符串形式绑定全局属性 -->
    <p v-bind:title="'abc'"></p>
     
    <!-- 单类名绑定 -->
    <p v-bind:class="c1"></p>
    <!-- 多类名绑定 -->
    <p v-bind:class="[c2, c3]"></p>
    <!-- 类名状态绑定 -->
    <p v-bind:class="{c4: true|false|var}"></p>
    <!-- 多类名状态绑定 -->
    <p v-bind:class="[{c5: true}, {c6: flase}]"></p>
     
    <!-- 样式绑定 -->
    <div :style="div_style"></div>
    <div :style="{ '100px', height: '100px', backgroundColor: 'blue'}"></div>
    <script type="text/javascript">
        new Vue({
            el:"#app",
            data: {
                abc: "abc",
                c1: "p1",
                c2: "p2",
                c3: "p3",
                div_style: {
                     "200px",
                    height: "200px",
                    backgroundColor: "cyan"
                }
            }
        })
    </script>
    <!-- v-bind: 指令可以简写为 : -->
    
    <!--
    a是变量,值就是类名
    b就是类名,不是变量
    c是变量,值为布尔,决定b类是否起作用
    d是变量,值可以为一个类名 'p1' 也可以为多个类名 "p1 p2 ..."
    calss="p1 b p2 p3"
    -->
    <p v-bind:class="[a, {b: c}]" v-bind:class="d"></p>
    <script>
        let app = new Vue({
            el: '#app',
            data: {
                a: 'p1',
                c: true,
                d: 'p2 p3',
            },
        })
    </script>
    

    案例:

    有三个按钮,初始化默认第一个为黄绿色,当选中其他的按钮,颜色也变为黄绿色

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>属性指令</title>
        <style>
            .p1 {
                 100px;
                height: 100px;
                background-color: red;
            }
            .p2 {
                border-radius: 50%;
            }
     
            .live {
                background-color: yellowgreen;
            }
     
        </style>
    </head>
    <body>
        <div id="app">
            <!--
            1)标签的属性没有被v-bind绑定,就是同原来一样,基本使用
            2)当被v-bind绑定,就会被vue控制,'值就会变为变量'
            换而言之:如果一个属性要被vue控制,填写变量,就要用v-bind来处理
            -->
            <p class="p1 p2"></p>
            <p v-bind:class="pc" style="color: red; background-color: orange;" v-bind:title="t" v-bind:owen="'o'">段落</p>
     
            <p v-bind:class="pc1"></p>
     
            <p v-bind:class="[pc, cp]"></p>
     
            <p v-bind:class="{p1: 1, p2: 0}"></p>
     
            <!-- a是变量,值就是类名 | b就是类名,不是变量 | c是变量,值为布尔,决定b类是否起作用 -->
            <p v-bind:class="[a, {b: c}]"></p>
     
            <hr>
            <!--
            1)v-bind: 可以简写为 :
            2)v-on: 可以简写为 @
            -->
            <button v-bind:class="{live: isLive == 1}" v-on:click="changeLive(1)">1</button>
            <button v-bind:class="{live: isLive == 2}" v-on:click="changeLive(2)">2</button>
            <button :class="{live: isLive == 3}" @click="changeLive(3)">3</button>
            <hr>
     
            <p style=" 50px; height: 50px; background-color: pink"></p>
            <p v-bind:style="myStyle"></p>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        let app = new Vue({
            el: '#app',
            data: {
                t: '悬浮提示',
                pc: 'p1',
                cp: 'p2',
                pc1: 'p1 p2',
                a: 'A',
                c: true,
                isLive: 1,
                myStyle: {
                     '50px',
                    height: '50px',
                    backgroundColor: 'pink',
                    borderRadius: '50%'
                }
            },
            methods: {
                changeLive (index) {
                    // this就代表当前vue对象,和app变量等价
                    // app.isLive = index;
                    this.isLive = index;
                }
            }
        })
    </script>
    </html>
    

    属性指令简写

    <!--
    1)v-bind: 可以简写为 :
    2)v-on: 可以简写为 @
    -->
     
    <button v-bind:class="{live: isLive == 1}" v-on:click="changeLive(1)">1</button>
    <button :class="{live: isLive == 2}" @click="changeLive(2)">2</button>
    <button :class="{live: isLive == 3}" @click="changeLive(3)">3</button>
    

    4、事件指令

    事件指令:

    1)在实例成员methods中声明事件方法

    2)标签通过事件指令绑定声明的方法:v-on:事件名='事件方法名'

            eg:`<button v-on:click="btnClick">按钮</button>`,不加()会自动传入ev($event)
    

    3)标签通过事件指令绑定声明的方法,且自定义传参:v-on:事件名="事件方法名()"

    •  eg: `<button v-on:click="btnClick()">按钮</button>`  不传任何参数
      
    •  eg: `<button v-on:click="btnClick($event)">按钮</button>`  传入事件对象,同不写()
      
    •  eg: `<button v-on:click="btnClick(10)">按钮</button>`  只传入自定义参数,当然也可以传入事件对象
      
    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="app">
            <button v-on:click="btnClick">{{ btn1 }}</button>
     
            <button v-on:click="btnClick">{{ btn2 }}</button>
            <hr>
     
            <!-- 直接绑定事件名:系统会在触发事件时(点击时)调用事件方法(fn1),传给事件方法一个参数(事件对象) -->
            <button v-on:click="fn1">按钮3</button>
     
            <!-- 绑定的事件名后跟着(),不是主动调用事件方法,而是表示在触发事件调用时,传入的参数全由用户自己决定 -->
            <button v-on:click="fn2($event, 10, 20)">按钮4</button>
     
            <hr>
            <button v-on:click="fn(btn1)">{{ btn1 }}</button>
     
            <button v-on:click="fn(btn2)">{{ btn2 }}</button>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        // 对比DOM驱动:1)js选择器获取目标标签 2)为目标标签绑定事件 3)在事件中完成相应逻辑
        // var btn = document.getElementsByTagName('button')[0];
        // btn.onclick = function () {
        //     console.log(111111111111);
        // };
     
        /**
         * 一、数据驱动
         *  1)操作是一个功能,使用需要一个方法来控制 2)方法名是变量,所以控制变量就可以控制该方法
         *
         *
         * 二、事件指令
         *  1)在实例成员methods中声明事件方法
         *  2)标签通过事件指令绑定声明的方法: v-on:事件名="事件方法名"
         *      eg: <button v-on:click="btnClick">按钮</button>
         *  3)标签通过事件指令绑定声明的方法,且自定义传参: v-on:事件名="事件方法名()"
         *      eg: <button v-on:click="btnClick()">按钮</button>  不传任何参数
         *      eg: <button v-on:click="btnClick($event)">按钮</button>  传入事件对象,同不写()
         *      eg: <button v-on:click="btnClick(10)">按钮</button>  只传入自定义参数,当然也可以传入事件对象
         */
        new Vue({
            el: '#app',
            data: {
                btn1: '按钮1',
                btn2: '按钮2',
            },
            methods: {
                btnClick () {
                    console.log(666)
                },
                fn1 (ev) {
                   console.log(ev.clientX, ev.clientY);  // ev.clientX ev指代事件对象,点clientX求的是鼠标点击页面位置的x轴像素
                },
                fn2(ev, n1, n2) {
                    console.log(ev, n1, n2);
                    console.log(ev.clientX, ev.clientY);
                },
                fn (msg) {
                    console.log(msg);
                }
            }
        })
    </script>
    </html>
     
    

    事件指令可以简写为@符号:

    <!-- v-on: 指令 简写 @ -->
    <!-- 不传参事件绑定,但事件回调方法可以获取事件对象 -->
    <p @click="fn"></p>
    <!-- ()可以传入具体实参 -->
    <p @click="fn()"></p>
    <!-- ()情况下,事件对象应该显式传入 -->
    <p @click="fn($event)"></p>
    

    事件补充和伪类选择器复习

    @click: 单击
    @dblclick:双击
    @mouseover:悬浮
    @mouseout:离开
    @mousedown:按下
    @mouseup:抬起

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>伪类与事件</title>
        <style>
            body {
                /* 不允许文本选中 */
                user-select: none;
            }
            .d1:hover {
                color: orange;
                /* 鼠标样式 */
                cursor: pointer;
            }
            /* 只有按下采用样式,抬起就没了 */
            .d1:active {
                color: red;
            }
            /* div标签压根不支持 :visited 伪类 */
            .d1:visited {
                color: pink;
            }
     
            .d2.c1 {
                color: orange;
            }
            .d2.c2 {
                color: red;
            }
            .d2.c3 {
                color: pink;
            }
        </style>
    </head>
    <body>
        <div id="app">
            <div class="d1">伪类操作</div>
            <br><br><br>
            <!--
            click: 单击
            dblclick:双击
            mouseover:悬浮
            mouseout:离开
            mousedown:按下
            mouseup:抬起
            -->
            <div :class="['d2', c]" @click="hFn('c1')" @mouseover="hFn('c2')" @mousedown="hFn('c3')">事件处理</div>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                c: '',
            },
            methods: {
                hFn (c) {
                    this.c = c
                }
            }
        })
    </script>
    </html>
    

    5、表单指令

    1)语法:v-model="变量"
    2)v-model绑定的变量控制的其实就是value属性值
    3)v-model要比v-bind:value要对一个监听机制
    4)数据的双向绑定:
    v-model可以将绑定的变量值映射给表单元素的value
    v-model还可以将表单元素的新value映射给报道的变量

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>表单指令</title>
    </head>
    <body>
        <div id="app">
            <form action="" method="">
    <!--            <input name="n1" type="text" :value="v1">-->
    <!--            <input name="n2" type="text" :value="v1">-->
     
                <!--
                    1)语法:v-model="变量"
                    2)v-model绑定的变量控制的其实就是value属性值
                    3)v-model要比v-bind:value要对一个监听机制
                    4)数据的双向绑定:
                        v-model可以将绑定的变量值映射给表单元素的value
                        v-model还可以将表单元素的新value映射给报道的变量
                -->
                <input name="n1" type="text" v-model="v1">
                <input name="n2" type="text" v-model="v1">
                <p @click="v1 = '点击了'">{{ v1 }}</p>
     
                <button type="submit">提交</button>
            </form>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                v1: '123'
            }
        })
    </script>
    </html>
    
    <div id="app">
        <!-- v-model针对于表单元素 -->
        <form action="" method="get">
            <!-- 1、双向绑定:服务于文本输入框 -->
            <!-- v-model存储的值为输入框的value值 -->
            <div>
                <input type="text" name="usr" v-model="in_val">
                <input type="password" name="ps" v-model="in_val" >
                <textarea name="info" v-model="in_val"></textarea>
            </div>
     
            <!-- 2、单选框 -->
            <div>
                <!-- 单选框是以name进行分组,同组中只能发生单选 -->
                <!-- v-model存储的值为单选框的value值 -->
                男:<input type="radio" name="sex" value="男" v-model="ra_val">
                女:<input type="radio" name="sex" value="女" v-model="ra_val">
                {{ ra_val }}
            </div>
     
            <!-- 3、单一复选框 -->
            <!-- v-model存储的值为true|false -->
            <!-- 或者为自定义替换的值 -->
            <div>
                <input type="checkbox" v-model='sin_val' true-value="选中" false-value="未选中" />
                {{ sin_val }}
            </div>
     
            <!-- 4、多复选框 -->
            <!-- v-model存储的值为存储值多复选框value的数组 -->
            <div>
                <input type="checkbox" value="喜好男的" name="cless" v-model='more_val' />
                <input type="checkbox" value="喜好女的" name="cless" v-model='more_val' />
                <input type="checkbox" value="不挑" name="cless" v-model='more_val' />
                {{ more_val }}
            </div>
        </form>
    </div>
     
    <script type="text/javascript">
        new Vue({
            el: '#app',
            data: {
                in_val: '',
                // 默认值可以决定单选框默认选项
                ra_val: '男',
                // 默认值为true,单一复选框为选中,反之false为不选中
                sin_val: '',
                // 数组中存在的值对应的复选框默认为选中状态
                more_val: ['喜好女的','不挑']
            }
        })
    </script>
    

    6、条件指令

    语法: v-show="变量"v-if="变量"

    两者的区别:

    • v-show在隐藏标签时,采用display:none渲染标签,标签通过css隐藏
    • v-if在隐藏标签时,不会渲染在页面上

    v-if的家族:

    3)v-if有家族:v-if | v-else-if | v-else
        v-if是必须的,必须设置条件
        v-else-if可以为0~n个,必须设置条件
        v-else可以为0~1个
       上方分支成立会屏蔽下方所有分支,从上至下依次类推
    
    <div id="app">
        <button @click="toggle">显隐切换</button>
        <!-- v-if -->
        <div class="box r" v-if="isShow"></div>
        <!-- v-show -->
        <div class="box o" v-show="isShow"></div>
        <!-- 1.条件渲染的值为true|false -->
        <!-- 2.true代表标签显示方式渲染 -->
        <!-- 3.false v-if不渲染到页面,v-show以display:none渲染到页面,但也不会显示 -->
     
        <!-- v-if v-else-if v-else 案例 -->
        <ul>
            <li @mouseover="changeWrap(0)">red</li>
            <li @mouseover="changeWrap(1)">green</li>
            <li @mouseover="changeWrap(2)">blue</li>
        </ul>
        <!-- red页面逻辑结构 -->
        <div class="wrap red" v-if="tag == 0" key="0">...</div>
        <!-- green页面逻辑结构 -->
        <div class="wrap green" v-else-if="tag == 1" key="1">...</div>
        <!-- blue页面逻辑结构 -->
        <div class="wrap blue" v-else key="2">...</div>
        <!-- v-if相关分支操作,在未显示情况下,是不会被渲染到页面中 -->
        <!-- 通过key全局属性操作后,渲染过的分支会建立key对应的缓存,提高下一次渲染速度 -->
     
        <!-- v-show 案例 -->
        <ul>
            <li @mouseover="changeMain(0)">red</li>
            <li @mouseover="changeMain(1)">green</li>
            <li @mouseover="changeMain(2)">blue</li>
        </ul>
        <!-- red页面逻辑结构 -->
        <div class="main red" v-show="whoShow(0)">...</div>
        <!-- green页面逻辑结构 -->
        <div class="main green" v-show="whoShow(1)">...</div>
        <!-- blue页面逻辑结构 -->
        <div class="main blue" v-show="whoShow(2)">...</div>
    </div>
    <script type="text/javascript">
        new Vue({
            el: "#app",
            data: {
                isShow: false,
                tag: 0,
                flag: 0
            },
            methods: {
                toggle () {
                    this.isShow = !this.isShow;
                },
                changeWrap (num) {
                    this.tag = num;
                },
                changeMain (num) {
                    // this.flag num
                    this.flag = num;
                },
                whoShow (num) {
                    // this.flag num
                    return this.flag == num;
                }
            }
        })
    </script>
    

    案例:

    点击按钮,展现不同颜色的div标签

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>案例</title>
        <style>
            body {
                margin: 0
            }
            button {
                 60px;
                line-height: 40px;
                float: right;
            }
            .bGroup:after {
                display: block;
                content: '';
                clear: both;
            }
            .box {
                /* vw: view width  vh: view height*/
                 100vw;
                height: 200px;
            }
            .red {
                background-color: red;
            }
            .green {
                background-color: green;
            }
            .blue {
                background-color: blue;
            }
     
            button.active {
                background-color: cyan;
            }
        </style>
    </head>
    <body>
        <div id="app">
            <div class="bGroup">
                <button :class="{active: isShow === 'red'}" @click="isShow = 'red'">红</button>
                <button :class="{active: isShow === 'green'}" @click="isShow = 'green'">绿</button>
                <button :class="{active: isShow === 'blue'}" @click="isShow = 'blue'">蓝</button>
            </div>
            <div>
                <div v-if="isShow === 'red'" class="box red"></div>
                <div v-else-if="isShow === 'green'" class="box green"></div>
                <div v-else class="box blue"></div>
            </div>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                isShow: 'red'
            }
        })
    </script>
    </html>
    

    7、循环指令

    语法:v-for="ele in obj" obj是被遍历的对象,ele是遍历得到的每一次结果

    除了遍历出可迭代对象,还可以遍历出索引以及key等数据

    /**
    * 遍历可迭代对象的首要结果,都是可迭代对象容器中的值,其次还可以遍历得到索引及键等数据
    *      字符串:v-for="v in str"  |  v-for="(v, i) in str"
    *      数组:v-for="v in arr"  |  v-for="(v, i) in arr"
    *      对象:v-for="v in obj"  |  v-for="(v, k) in obj"  |  v-for="(v, k, i) in obj"
    * 注:v-for遍历要依赖于一个所属标签,该标签及内部所有内容会被遍历复用
    */
    
    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>循环指令</title>
    </head>
    <body>
        <div id="app">
            <!-- 遍历数字
            5
            【1】【2】【3】【4】【5】
            -->
            <p>{{ d1 }}</p>
            <i v-for="e in d1">【{{ e }}】</i>
            <hr>
     
            <!-- 遍历字符串
            abc
            【a】【b】【c】
            【0a】【1b】【2c】
            -->
            <p>{{ d2 }}</p>
            <i v-for="e in d2">【{{ e }}】</i>
            <i v-for="(e, i) in d2">【{{ i }}{{ e }}】</i>
            <hr>
     
            <!-- 遍历数组
            [ 1, 3, 5 ]
            【1】【3】【5】
            【01】【13】【25】
            -->
            <p>{{ d3 }}</p>
            <i v-for="e in d3">【{{ e }}】</i>
            <i v-for="(e, i) in d3">【{{ i }}{{ e }}】</i>
            <hr>
     
            <!-- 遍历对象
            { "name": "Bob", "age": 17.5, "gender": "男" }
            【Bob】【17.5】【男】
            【name-Bob】【age-17.5】【gender-男】
            【name-Bob-0】【age-17.5-1】【gender-男-2】
            -->
            <p>{{ d4 }}</p>
            <i v-for="e in d4">【{{ e }}】</i>
            <i v-for="(e, k) in d4">【{{ k }}-{{ e }}】</i>
            <i v-for="(e, k, i) in d4">【{{ k }}-{{ e }}-{{ i }}】</i>
            <hr>
     
        </div>
    </body>
    <script>
        new Vue({
            el: '#app',
            data: {
                d1: 5,
                d2: 'abc',
                d3: [1, 3, 5],
                d4: {
                    name: "Bob",
                    age: 17.5,
                    gender: "男"
                }
            }
        })
    </script>
     
    
    <div id="app">
        <h1>{{ msg }}</h1>
        <!-- v-for="item in items" -->
        <!-- 遍历的对象: 数组[] 对象(字典){} -->
        <ul>
            <li>{{ list[0] }}</li>
            <li>{{ list[1] }}</li>
            <li>{{ list[2] }}</li>
            <li>{{ list[3] }}</li>
            <li>{{ list[4] }}</li>
        </ul>
     
        <!-- n为遍历的元素值 -->
        <ul>
            <li v-for="n in list">{{ n }}</li>
        </ul>
     
        <!-- 一般列表渲染需要建立缓存 -->
        <!-- 列表渲染是循环,需要赋值变量给key,使用key需要v-bind:处理 -->
        <!-- v-for变量数组[]时,接收两个值时,第一个为元素值,第二个为元素索引 -->
        <ul>
            <li v-for="(n, i) in list" :key="i">value:{{ n }} | index: {{ i }}</li>
        </ul>
     
        <ul>
            <li>{{ dic['name'] }}</li>
            <li>{{ dic.age }}</li>
            <li>{{ dic.gender }}</li>
        </ul>
     
        <!-- v-for变量对象{}时,接收三个值时,第一个为元素值,第二个为元素键,第三个为元素索引 -->
        <ul>
            <li v-for="(v, k, i) in dic" :key="k">value:{{ v }} | key:{{ k }} | index: {{ i }}</li>
        </ul>
     
     
        <!-- 遍历的嵌套 -->
        <div v-for="(person, index) in persons" :key="index" style="height: 21px;">
            <div v-for="(v, k) in person" :key="k" style="float: left;">{{ k }} : {{ v }}&nbsp;&nbsp;&nbsp;</div>
        </div>
    </div>
    <script type="text/javascript">
        new Vue({
            el: "#app",
            data: {
                msg: "列表渲染",
                list: [1, 2, 3, 4, 5],
                dic: {
                    name: 'zero',
                    age: 88888,
                    gender: 'god'
                },
                persons: [
                    {name: "zero", age: 8},
                    {name: "egon", age: 78},
                    {name: "liuXX", age: 77},
                    {name: "yXX", age: 38}
                ]
            }
        })
    </script>
    

    商品循环案例:

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>循环案例</title>
        <style>
            .box {
                 280px;
                border: 1px solid #eee;
                border-radius: 5px;
                overflow: hidden; /* 隐藏超出父级显示范围外的内容 */
                text-align: center; /* 文本相关的属性大多默认值是inherit */
                float: left;
                margin: 10px;
            }
            .box img {
                 100%;
            }
     
        </style>
    </head>
    <body>
        <div id="app">
            <!--
            <div class="box">
                <img src="https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2457147274,3329097728&fm=26&gp=0.jpg" alt="">
                <p>纯种拆家专家</p>
            </div>
            -->
     
            <div class="box" v-for="obj in goods">
                <img :src="obj.img" alt="">
                <p>{{ obj.title }}</p>
            </div>
     
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        /* 伪代码,模拟请求后台数据
        let data = null;
     
        import jq
        $.ajax({
            url: '',
            type: 'get',
            data: {
     
            },
            success (response) {
                data = response.data
            },
        });
        */
     
        // 前台先制作假数据进行测试
        let goods = [
            {
                "img": "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2457147274,3329097728&fm=26&gp=0.jpg",
                "title": "纯种拆家专家"
            },
            {
                "img": "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2457147274,3329097728&fm=26&gp=0.jpg",
                "title": "纯种拆家专家"
            },
            {
                "img": "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2457147274,3329097728&fm=26&gp=0.jpg",
                "title": "纯种拆家专家"
            }
        ];
     
        new Vue({
            el: '#app',
            data: {
                goods,
            }
        })
    </script>
    </html>
    

    8、todolist案例

    <div id="app">
        <div>
            <input type="text" v-model="val">
            <button type="button" @click="submitMsg">提交</button>
        </div>
        <ul>
            <li v-for="(v, i) in list" :key="i" @click="removeMsg(i)">{{ v }}</li>
        </ul>
        {{ list }}
    </div>
    <script type="text/javascript">
        new Vue({
            el: "#app",
            data: {
                val: "",
                list: []
            },
            methods: {
                submitMsg () {
                    if (this.val) {
                        this.list.push(this.val);
                        this.val = ""
                    }
                },
                removeMsg(index) {
                    this.list.splice(index, 1)
                }
            }
        })
    </script>
    

    留言板案例:
    根据todolist案例,改变为一个留言板案例

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>todolist</title>
        <style>
            li:hover {
                color: red;
                cursor: pointer;
            }
        </style>
    </head>
    <body>
        <div id="app">
            <form>
                <input type="text" v-model="info">
                <button type="button" @click="sendInfo">留言</button>
            </form>
            <ul>
                <li v-for="(info, index) in info_arr" @click="deleteInfo(index)">{{ info }}</li>
            </ul>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                info: '',
                // 三目运算符: 条件 ? 结果1 : 结果2
                info_arr: localStorage.info_arr ? JSON.parse(localStorage.info_arr) : [],
            },
            methods: {
                sendInfo () {
                    // 完成留言:将info添加到info_arr
                    // 增 push unshift | 删 pop shift
                    if (this.info) {
                        // 留言
                        this.info_arr.push(this.info);
                        // 清空输入框
                        this.info = '';
                        // 前台数据持久化(缓存)
                        localStorage.info_arr = JSON.stringify(this.info_arr);
                    }
                },
                deleteInfo(index) {
                    // 删
                    this.info_arr.splice(index, 1);
                    // 同步给数据库
                    localStorage.info_arr = JSON.stringify(this.info_arr);
                }
            }
        })
    </script>
     
    <script>
        let arr = [1, 2, 3];
        console.log(arr);
        // 参数:开始索引,操作长度,操作的结果们,splice函数可以完成增删改插所有功能
        arr.splice(1, 2);
        console.log(arr);
    </script>
    <script>
        let a = [1, 2, 3];
        localStorage.arr = JSON.stringify(a);
        let b = JSON.parse(localStorage.arr);
        console.log(b);
     
    </script>
    </html>
    

    前台数据库

    两种前台数据库类型的区别

    • localStorage 永久存储
    • sessionStorage 生命周期同所属页面标签
        localStorage | sessionStorage
        1)操作就类似于obj,直接 .key 语法访问 value
        2)localStorage永久存储
        3)sessionStorage生命周期同所属页面标签
     
        // 前台数据库
     
        // 存
        // 持久化化存储,永远保存
        // localStorage.name = "Bob";
        // 持久化化存储,生命周期同所属标签(页面),页面关闭,重新打开就会丢失
        // sessionStorage.name = "Tom";
     
        // 取
        // console.log(localStorage.name);
        // console.log(sessionStorage.name);
     
        // 清空
        // localStorage.clear();
        // sessionStorage.clear();
        
        // 删除单个key:value
        // localStorage.removeItem(key)
     
        // 短板:只能存储字符串,所有对象和数组需要转换为json类型字符串,再进行存储
    
  • 相关阅读:
    20150629_Andriod_06_插入_删除_弹出式操作数据
    20150626_Andriod_02_ListView2_列表与详细信息
    Andriod 字符串数组里加入字符串元素
    20150625_Andriod_02_ListView2_多条目显示_选中
    20150625_Andriod_01_ListView1_条目选中
    Android开发中完全退出程序的三种方法
    Python中的单例模式的几种实现方式的及优化
    jdk与jre
    页面跳转
    用for循环创建对象
  • 原文地址:https://www.cnblogs.com/cnhyk/p/12306291.html
Copyright © 2020-2023  润新知