zoukankan      html  css  js  c++  java
  • Vue表单指令, 条件指令, 循环指令, 成员

    习题详解

    '''
        <style>
            .box {
                 200px;
                height: 200px;
            }
        </style>
        
        <button @click="bClick('red')">红色</button>
        <button @click="bClick('blue')">蓝色</button>
        <button @click="bClick('green')">绿色</button>
        <div class="box" :style="{backgroundColor: bgc}"></div>
        
        new Vue({
            el: '#app',
            data: {
                bgc: 'black',
            },
            methods: {
                bClick(color) {
                    this.bgc = color;  // 在Vue实例内部访问变量要使用this, 在标签属性内部可以直接拿到变量
                },
            },
        })
    '''
    
    '''
        <style>
            .box {
                 200px;
                height: 200px;
                color: white;
                font: bold 50px/200px 'STSong';
                user-select: none;
                cursor: pointer;  # 光标样式
                text-align: center;
            }
        </style>
        
        <div class="box" @click="dClick" :style="{backgroundColor: bgc}">{{count}}</div>
        
        new Vue({
            el: '#app',
            data: {
                count: 0,
                bgc: 'black',
                colorArr: ['pink', 'green', 'blue']
            },
            methods: {
                dClick() {
                    this.count++;
                    this.bgc = this.colorArr[this.count % 3]
                },
            },
        }) 
    '''
    
    '''
    <style>
            #d1 {
                border: 3px solid pink;
                 200px;
                height: 200px;
                border-radius: 50%;
                overflow: hidden; /*在父标签中设置, 将子标签溢出的内容隐藏*/
                margin: 50px auto 0; /*距上空白50px, 左右居中*/
            }
    
            .c1 {
                /*
                1. 浮动元素会生成一个块级框,
                2. 如果一行之上供可浮动元素的空间不够,那么这个元素会跳至下一行,
                3. 这个过程会持续到某一行拥有足够的空间为止
                */
                float: left;
            }
        </style>
     
    <div id="app">
        <div id="d1" @click="dClick">
            <div class="c1" :style="{ w, height: h, backgroundColor: bgc1}"></div>
            <div class="c1" :style="{ w, height: h, backgroundColor: bgc2}"></div>
        </div>
    </div>
    
    new Vue({
        el: '#app',
        data: {
            w: '100px',
            h: '200px',
            bgc1: 'red',
            bgc2: 'green',
            count: 0,
        },
        methods: {
            dClick() {
                this.count++;
                if (this.count % 2 === 1) {
                    this.w = '200px';
                    this.h = '100px';
                }
                else {
                    this.w = '100px';
                    this.h = '200px';
                }
                if (this.count % 4 >= 2) {
                    this.bgc1 = 'green';
                    this.bgc2 = 'red';
                }
                else {
                    this.bgc1 = 'red';
                    this.bgc2 = 'green';
                }
    
            },
        },
    })
    '''
    

    表单指令

    表单指令: v-model="变量", 变量值与表单标签的value相关

    '''
    <input type="text" name="user1" id="id_user1" :value="v1" placeholder="">
        {{v1}}  <!--普通属性操作只能将v1的值给value, 而value的值不能反过来给v1-->
    
        <input type="text" name="user2" id="id_user2" v-model="v2" placeholder="">
        {{v2}}  <!--数据双向绑定, 变量值可以影响表单类标签的value, 反之表单类标签的value也可以影响变量值-->
       
        new Vue({
            el: '#app',
            data: {
                v1:123,
                v2:456,
            },
            methods: {},
        })
    '''
    
    '''
        <form action="">
            <!--
            radio单选框:
                1. 布尔类型属性, 属性名与属性值相同, 通常省略multiple, selected
                2. button标签及表单类标签都要在form标签中才能提交, http://...?gender=male#
            -->
            男: <input type="radio" name="gender" value='male' v-model="v2">
            女: <input type="radio" name="gender" value='female' v-model="v2">
    
            <p>{{v2}}</p>  <!--male-->
    
            <!--
            checkbox单一复选框:
                1. 有name属性才能提交, http://...?gender=male&agree=on
            -->
            卖身契: 同意 <input type="checkbox" name="agree" v-model="v3">
            <p>{{v3}}</p>  <!--true/false-->
    
            <!--
            checkbox多复选框:
                1. 有name属性才能提交, http://...?gender=male&agree=on
            -->
            爱好: <br>
            网游: <input type="checkbox" name="hobby" value="game" v-model="v4">
            篮球: <input type="checkbox" name="hobby" value="basketball" v-model="v4">
            {{v4}}  <!--[], [ "basketball", "game" ]-->
    
            <p>
                <button type="submit">提交</button>
            </p>
        </form>
        
        new Vue({
            el: '#app',
            data: {
                v2: 'male',  // radio默认选中男性
                v3: true,  // checkbox单一复选框默认选中
                v4: ['basketball'],  // checkbox多复选框默认选中
            },
            methods: {},
        })
    '''
    

    条件指令

    条件指令:

    v-show="布尔变量", 布尔变量值为false时, 标签以 display:none 渲染, 侧重于动态效果

    v-if="布尔变量", 布尔变量值为false时, 标签不渲染, 侧重于数据安全方面

    v-if | v-else-if | v-else

    '''
        <div class="box r" v-show="is_true"></div>  <!--<div class="box r" style="display: none;"></div>-->
        <div class="box b" v-if="is_true"></div>
        
        new Vue({
            el: '#app',
            data: {
                is_true: false
            },
            methods: {},
        })
    '''
    

    v-if家族

    '''
    	# 在html页面的标签中, 可以直接通过vue变量名操作变量
        <style>
            [v-cloak] {
                display: none;
            }
    
            .box {
                 300px;
                height: 200px;
                border: 3px solid aqua;
            }
    
            .r {
                background-color: red;
            }
    
            .g {
                background-color: green;
            }
    
            .b {
                background-color: blue;
            }
    
            .active {
                background-color: pink;
            }
        </style>
    </head>
    
    <body>
    <div id="app" v-cloak>
        <button @click="show_what_page='r_page'" :class="{active: show_what_page === 'r_page'}">红</button>
        <button @click="show_what_page='g_page'" :class="{active: show_what_page === 'g_page'}">绿</button>
        <button @click="show_what_page='b_page'" :class="{active: show_what_page === 'b_page'}">蓝</button>
    
        <div class="box r" v-if="show_what_page === 'r_page'">{{info}}</div>
        <div class="box g" v-else-if="show_what_page === 'g_page'"></div>
        <div class="box b" v-else=></div>
    </div>
    </body>
    
    <script src="js/vue.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                show_what_page: null,
            },
            methods: {},
        })
    </script>
    '''
    

    斗篷指令

    1. 在网络不好或加载数据过大的情况下,页面在渲染的过程会闪烁
    2. 使用斗篷指令 + display: none 使vue实例准备完毕再渲染页面
    '''
    ...
        <style>
            [v-cloak] {display: none;}
            ...
        </style>
    
    </head>
    
    <body>
    <div id="app" v-cloak>
        ...
    </div>
    </body>
    
    <script src="js/vue.js"></script>
    <script>
        new Vue({
            el: '#app',
           ...
        })
    </script>
    '''
    

    循环指令

    循环指令: v-for="ele in string|array|object"

    '''
    <div id="app" v-cloak>
        <p>{{info}}</p>  <!--good study-->
        <p v-for="(ele, index) in info">第{{index + 1}}个字符为:{{ele}}</p>  <!--每次循环会包含标签, 第1个字符为:g-->
    
        <!--字典无序, 存储效率高, 读取效率低, 优化: 将key有序化, 结果: 1-age: 36.7-->
        <p v-for="(v, k, i) in user">{{i}}-{{k}}: {{v}}</p>
    
        <!--循环嵌套-->
        <p v-for="teacher in teachers">
            <span v-for="(v, k, i) in teacher">
                <span v-if="i !== 0">|</span> {{k}}: {{v}}  <!--name: jason | age: 50 | gender: 男-->
            </span>
        </p>
    </div>
    
        new Vue({
            el: '#app',
            data: {
                info: 'good study',
                user: {
                    name: '小猴老师',
                    age: 36.7
                },
                teachers: [
                    {
                        name: 'jason',
                        age: 50,
                        gender: '男',
                    },
                    {
                        name: 'tank',
                        age: 18,
                        gender: '女',
                    }
                ]
            },
            methods: {},
        })
    '''
    

    循环指令案例todolist + 前端数据库

    前端数据库

    • localStorage: 永久存储, 归属于标签页, 对应标签页关闭后重新打开任然存在
    • sessionStorage: 临时存储, 所属标签页表被关闭时被清除
    • 查看: f12-->Application-->Local Storage|Session Storage
    '''
    <div id="app">
        <input type="text" v-model="content">
        <button type="button" @click="send_content">留言</button>  <!--写button标签要明确type, 默认为submit-->
        <ul>
            <!--给每个li设定点击事件: 删除该li, 每次循环时将对应li的index传给事件函数-->
            <li v-for="(msg, index) in msgs"><span @click="delete_content(index)">{{msg}}</span></li>
        </ul>
    </div>
    
    
        new Vue({
            el: '#app',
            data: {
                // 三元表达式, 条件 ? code1 : code2, 条件成立执行?后的code1, 否则执行:后的code2
                msgs: localStorage.msgs ? JSON.parse(localStorage.msgs) : [],  // 数据使用前端数据库存取, 页面刷新不会清空留言
                content: '',
            },
            methods: {
                send_content() {
                    if (!this.content) {
                        alert('请输入内容!');
                    }
                    else {
                        this.msgs.push(this.content);  // 首增|首删: unshift|shift, 尾增|尾删: push|pop
                        this.content = '';  // 留言后情况输入框
    
                        localStorage.msgs = JSON.stringify((this.msgs))
                    }
                    // 第一个元素的最左端开始计算索引, 从第一个参数往后截切的元素数量, 将第三个参数内容拼接到被剪切的位置
                    // this.msgs.splice(0, 1)  // 可以对容器类数据的进行增删改操作
                },
                delete_content(index) {
                    this.msgs.splice(index, 1);  // 点击对应的留言则删除
                    localStorage.msgs = JSON.stringify((this.msgs))
                },
            },
        })
        
        // localStorage.arr = [1, 2, 3];  // 按字符串格式存储
        // console.log(localStorage.arr[3])  // ,
        // localStorage.arr = JSON.stringify([1, 2, 3]);
        // console.log(JSON.parse(localStorage.arr))  // [1, 2, 3]
    	// localStorage.clear()  // 清空前端数据库
    '''
    

    分隔符成员

    '''
    <div id="app">
        [{info}]  <!--信息]-->
    </div>
    
        new Vue({
            el: '#app',
            data: {
                info: '信息',
            },
            methods: {},
            delimiters: ['[{', '}']  // 例如vue语法的插值表达式与django模板语法冲突时, 可以用delimiter更改分隔符
        })
    '''
    

    过滤器成员

    1. 过滤器需在filter成员中定义,
    2. 可以对多个数据进行过滤, 还可以再给过滤器传入额外的参数
    3. 过滤的结果可以再进行下一次过滤
    4. 需要根据不同条件多次获取数据, 使用前端过滤器, 只需要获取一次数据, 后端直接返回
    '''
    <div id="app">
        {{num|f1}}  <!--676-->
        {{a, b|f2(40, 50)|f1}} <!--716-->
    </div>
    
        new Vue({
            el: '#app',
            data: {
                num: 10,
                a: 20,
                b: 30,
            },
            methods: {},
            filters: {  // 传入数据, 返回过滤后的结果
                f1(a, b) {
                    console.log(a, b);  // 10 undefined; 50 undefined
                    return a + 666;
                },
                f2(a, b, c, d) {
                    console.log(a, b, c, d);  // 20 30 40 50
                    return a + b  // 50
                },
            },
        })
    '''
    

    计算属性成员

    1. 计算属性成员中可以声明方法属性, 方法属性不能再在data中重复声明
    2. 方法属性必须在页面中渲染才会, 才会调用绑定的方法
    3. 方法属性的值就是绑定方法的返回值
    4. 绑定的方法中出现的所有变量都会被监听, 任何一个被监听的变量值发生改变, 都会重新触发绑定方法, 从而更新方法属性的值
    5. 通常用来处理一个变量的值依赖于多个变量值的问题
    '''
    <div id="app">
        <!--js为弱语言, 不同类型数据运算会自动进行类型转换, 且字符串运算优先于数字运算-->
        <p>{{5 + '2'}}</p>  <!--"52"-->
        <p>{{5 - 2}}</p>  <!--3-->
    
        <input type="number" v-model="n1">
        +
        <input type="number" v-model="n2">
        =
        <button>{{+n1 + +n2}}</button>  <!--字符串前面加"+"变成数字-->
        <p><button>{{res}}</button></p>
    </div>
    
        new Vue({
            el: '#app',
            data: {
                n1: null,
                n2: null,
            },
            methods: {},
            computed: {
                res() {
                    n1 = +this.n1;
                    n2 = +this.n2;
                    return n1 + n2
                },
            }
    
        })
    '''
    

    监听属性成员

    1. 被监听的变量需要在data属性成员中声明, 监听方法不需要返回值
    2. 监听方法名就是被监听的变量名, 该变量值更新时就会回调监听方法
    3. 监听方法有两个回调参数, 第一个为被监听变量的当前值, 第二个为被监听变量的上次值
    4. 通常用来处理多个变量依赖于一个变量值的问题
    '''
    <div id="app">
        <p>姓名: <input type="text" v-model="full_name"></p>
        <p>姓: {{first_name}}</p>
        <p>名: {{last_name}}</p>
        <p>{{$data}}</p>  <!--$可以选择成员属性, { "full_name": "", "first_name": "未知", "last_name": "未知" }-->
    </div>
    
        new Vue({
            el: '#app',
            data: {
                full_name: '',
                first_name: '未知',
                last_name: '未知',
            },
            methods: {},
            watch: {
                // n为被监听变量的当前值, o为被监听变量的上次值, 被监听对象每次更新值都会回调监听方法
                full_name(n, o) {
                    // console.log(n, o)
                    this.first_name = n[0];  // 张
                    this.last_name = n.replace(n[0], '')  // 三丰
                },
            },
        })
    '''
    
  • 相关阅读:
    gc buffer busy/gcs log flush sync与log file sync
    给Oracle年轻的初学者的几点建议
    Android 编程下帧动画在 Activity 启动时自动运行的几种方式
    Android 编程下 Touch 事件的分发和消费机制
    Java 编程下 static 关键字
    Java 编程下 final 关键字
    Android 编程下模拟 HOME 键效果
    Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated ?
    Extjs4 大型项目目录结构重构
    [转]SQLServer 2008 允许远程连接的配置方法
  • 原文地址:https://www.cnblogs.com/-406454833/p/12117966.html
Copyright © 2011-2022 走看看