• 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], '')  // 三丰
                },
            },
        })
    '''
    
  • 相关阅读:
    document.referrer
    uniapp打包apk(真机测试没问题,打包apk后部分功能没反应)
    electron初次学习(新建项目打包到应程序)
    localstorage和sessionStorage一起使用的坑
    字符串去掉第一个和最后一个逗号
    uni.switchTab()跳转不刷新
    2022中国准独角兽企业100强
    火星家园创意比赛规则1
    57所学校195个小组409名学生1
    57所学校195个小组409名学生
  • 原文地址:https://www.cnblogs.com/-406454833/p/12117966.html
Copyright © 2020-2023  润新知