zoukankan      html  css  js  c++  java
  • vue 样式穿透 watch深度监听

    在开发中修改第三方组件样式是很常见,但由于 scoped 属性的样式隔离,可能需要去除 scoped 或是另起一个 style 。这些做法都会带来副作用(组件样式污染、不够优雅),样式穿透在css预处理器中使用才生效。
    我们可以使用 >>> 或 /deep/ 解决这一问题:
    <style scoped>
    外层 >>> .el-checkbox {
      display: block;
      font-size: 26px;
    
      .el-checkbox__label {
        font-size: 16px;
      }
    }
    </style>
    <style scoped>
    /deep/ .el-checkbox {
      display: block;
      font-size: 26px;
    
      .el-checkbox__label {
        font-size: 16px;
      }
    }
    </style>

    .conBox ::v-deep .el-input__inner{
        padding:0 10px;
    }
     

    watch高阶使用

    立即执行

    watch 是在监听属性改变时才会触发,有些时候,我们希望在组件创建后 watch 能够立即执行
    可能想到的的方法就是在 create 生命周期中调用一次,但这样的写法不优雅,或许我们可以使用这样的方法

    export default {
        data() {
            return {
                name: 'Joe'
            }
        },
        watch: {
            name: {
                handler: 'sayName',
                immediate: true
            }
        },
        methods: {
            sayName(newVal,oldVal) {
                console.log(this.name)
            }
        }
    }
     

    深度监听

    在监听对象时,对象内部的属性被改变时无法触发 watch ,我们可以为其设置深度监听

    export default {
        data: {
            studen: {
                name: 'Joe',
                skill: {
                    run: {
                        speed: 'fast'
                    }
                }
            }
        },
        watch: {
            studen: {
                handler: 'sayName',
                deep: true
            }
        },
        methods: {
            sayName() {
                console.log(this.studen)
            }
        }
    }
    
    使用数组可以设置多项,形式包括字符串、函数、对象
    export default {
        data: {
            name: 'Joe'
        },
        watch: {
            name: [
                'sayName1',
                function(newVal, oldVal) {
                    this.sayName2()
                },
                {
                    handler: 'sayName3',
                    immaediate: true
                }
            ]
        },
        methods: {
            sayName1() {
                console.log('sayName1==>', this.name)
            },
            sayName2() {
                console.log('sayName2==>', this.name)
            },
            sayName3() {
                console.log('sayName3==>', this.name)
            }
        }
    }
    watch监听多
    watch本身无法监听多个变量。但我们可以将需要监听的多个变量通过计算属性返回对象,再监听这个对象来实现“监听多个变量”
    export default {
        data() {
            return {
                msg1: 'apple',
                msg2: 'banana'
            }
        },
        compouted: {
            msgObj() {
                const { msg1, msg2 } = this
                return {
                    msg1,
                    msg2
                }
            }
        },
        watch: {
            msgObj: {
                handler(newVal, oldVal) {
                    if (newVal.msg1 != oldVal.msg1) {
                        console.log('msg1 is change')
                    }
                    if (newVal.msg2 != oldVal.msg2) {
                        console.log('msg2 is change')
                    }
                },
                deep: true
            }
        }
    }

    事件参数$event

    $event 是事件对象的特殊变量,在一些场景能给我们实现复杂功能提供更多可用的参数
    原生事件

    在原生事件中表现和默认的事件对象相同

    <template>
        <div>
            <input type="text" @input="inputHandler('hello', $event)" />
        </div>
    </template>
    export default {
        methods: {
            inputHandler(msg, e) {
                console.log(e.target.value)
            }
        }
    }
    
    
     
  • 相关阅读:
    mysql-四舍五入
    数据库基础
    大白话五种IO模型
    Python程序中的协程操作-gevent模块
    Python程序中的协程操作-greenlet模块
    协程基础
    Python程序中的线程操作-concurrent模块
    Python程序中的线程操作-线程队列
    Python程序中的线程操作-锁
    Python程序中的线程操作-守护线程
  • 原文地址:https://www.cnblogs.com/webljl/p/13718232.html
Copyright © 2011-2022 走看看