v-cloak 指令,v-once 指令,v-pre 指令,事件修饰符,v-model原理 ,自定义指令,二级联动

本文详细介绍了Vue.js中的v-cloak、v-once、v-pre指令的使用,以及v-model双向数据绑定、事件修饰符、自定义指令和二级联动、computed计算属性的原理和应用。
摘要由CSDN通过智能技术生成

一.内置指令

1.v-cloak 指令:

1.没有值

2.本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性

3.使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题

 使用方法:

[v-cloak]{
            display: none;
        }

解决屏幕闪烁的问题,第一在标签上添加v-cloak,第二需要设置上面样式

2.v-once 指令

 v-once设置了以后,更改值不会发生改变,优化性能 

<title>v-once指令</title>
<script type="text/javascript" src="../js/vue.js"></script>

<div id="root">
  <h2 v-once>初始化的n值是: {{n}}</h2>
  <h2>当前的n值是: {{n}}</h2>
  <button @click="n++">点我n+1</button>
</div>
<script type="text/javascript">
  Vue.config.productionTip = false
  new Vue({ el: '#root', data: {n:1} })
</script>
3.v-pre 指令

好处:

1.跳过v-pre所在节点的编译过程
2.可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译

3.设置了以后,会让插值和指令失效

二.重点:不需要设置值的指令

以下:

v-else,v-cloak,v-once,v-pre

三.事件修饰符

        .prevent 阻止浏览器默认事件

        .stop阻止冒泡事件

        .once只触发一次

        .capture捕获模式    打乱冒泡顺序(即可以理解为给元素添加一个监听器,当元素发生冒泡时,

        先触发带有该修饰符的元素。若有多个该修饰符,则由外而内触发

        .self 阻止自身事件促发,但不会阻止冒泡,间接性有捕获效果

        在冒泡事件中,点击设置了self的子类,才不会触发自身

        点击设置了self本身是可以触发的-

例如:

.box1{
            width: 300px;
            height: 300px;
            border: 5px solid red;
        }
        .box2{
            width: 200px;
            height: 200px;
            border: 5px solid pink;
        }
        .box3{
            width: 100px;
            height: 100px;
            display: inline-block;
            border: 5px solid orange;
        }
 <div id="app">
       
        <!-- event.stopPropagation()阻止冒泡 -->
        <a href="" @click.prevent="func1()">链接</a>
        <div @click.self="func2()" class="box1">
            1
            <p @click.self.once="func3()" class="box2">
                2
                <span @click="func4()" class="box3">3</span>
            </p>
        </div>
</div>
<script src="../vue.js"></script>
<script>
    Vue.config.productionTip = false;
    var vm = new Vue({
        el:"#app",
        data() {
            return {
                
            }
        },
        methods: {
           
            func1(){
                console.log(1111111111111111111);
            },
            func2(){
                console.log("div元素");
            },
            func3(){
                // console.log(event);
                // event.stopPropagation();
                console.log("p元素");
            },
            func4(){
                console.log("span元素");
            }
        },
    })

如图示:

四.v-model原理

1.v-model修饰符

        .lazy 失去焦点后提交值

        .number有效转换"1"== 1 为数字

        .trim清除前后空格-

例如:

<form action="" method=""  @click.prevent="func()">
            <!-- 注:使用v-model时尽量使用v-model="" 不要使用v-model:value="",
            只有在需要设置初始值才使用v-model:value="" -->
            姓名:<input type="text" v-model.trim="formData.userName">
            <!-- 姓名:<input type="text" v-model.trim:value="formData.userName"> -->

            <br>
            <!-- 年龄:<input type="number" v-model:value="formData.age"> -->
            <!-- v-model.number有效转换"1"== 1 为数字 -->
            年龄:<input type="number" v-model="formData.age">
            年龄:<input type="number" v-model.number="formData.ages">
            <br>
            性别:
            <label for="nan">男</label>
            <input type="radio" id="nan" name="1" v-model="formData.sex" value="1">
            <label for="nv">女</label>
            <input type="radio" id="nv" name="1" v-model="formData.sex" value="2">
            <br>
            手机号:
            <input type="tel" v-model:value="formData.iphone">
            <br>
            爱好:
            <label for="sing">唱</label>
            <input type="checkbox" id="sing" v-model="formData.like" value="sing">
            <label for="junp" >跳</label>
            <input type="checkbox" id="junp" v-model="formData.like" value="junp">
            <label for="rap">rap</label>
            <input type="checkbox" id="rap" v-model="formData.like" value="rap">
            <label for="bask">篮球</label>
            <input type="checkbox" id="bask" v-model="formData.like" value="bask">
            <br>
            <!-- v-model.lazy 失去焦点后提交值 -->
            <textarea v-model.lazy="formData.other" name="" id="" cols="30" rows="10"></textarea>
            <textarea v-model="formData.others" name="" id="" cols="30" rows="10"></textarea>
            {{formData.other}}
            {{formData.others}}
            <br>
            <input type="submit" value="提交">
            <!-- <button>确定</button> -->
        </form>
    </div>
script src="../vue.js"></script>
<script>
    Vue.config.productionTip = false;
    var vm = new Vue({
        el:"#app",
        data() {
            return {
                formData:{
                    userName:"",
                    age:0,
                    ages:0,
                    sex:"",
                    iphone:"",
                    like:[],
                    other:"",
                    others:"",

                }
            }
        },
        methods: {
            func(){
                console.log(typeof this.formData.age);
                console.log(typeof this.formData.ages);
                console.log(this.formData.age+this.formData.ages);
                console.log(this.formData);
            },
        },
    })
</script>

2.v-model是什么

 1.双向数据绑定,既可以从data流向页面,也可以由页面流向data

 2.通常用于表单收集,v-model默认绑定value值

  3.v-model:value=""或v-model=""(简写)

3.v-model原理

1.v-model本质是一个语法糖

2.v-bind绑定数据

3.oninput数据传递

五.自定义指令

1.规则:定义指令名称不能使用驼峰和v-,要是用-连接,记得添加引号

        // 使用时要v-自定义名称

        // 函数写法

        // 名称(节点,绑定对象){}

        // 对象写法

        // 名称:{

            // 绑定成功调用

            // bind(节点,绑定对象){},

            // 插入到页面调用

            // inserted(节点,绑定对象){},

            // 重新解析时调用(值发生改变)

            // update(节点,绑定对象){}

        // }

 2.局部自定义指令

        //directives ,写入Vue实例中

        // .全局自定义指令

        // Vue.directive ,定义在实例化之前

代码如下:

<body>
    <div id="app">
        <button @click="func()">点击</button>
        <h1 v-nums="sum"></h1>
        <h1 v-nums-ing="sums"></h1>
        <h1 v-num1="sum1"></h1>
        <h1 v-num2="sum2"></h1>
    </div>
</body>
<script src="../vue.js"></script>
<script>
    Vue.config.productionTip = false;
    Vue.directive("num2",function(element,binding){
        element.innerHTML = binding.value;
    })
    Vue.directive("num1",{
        bind(element,binding){
            // console.log(element);
            // console.log(binding);
        },
        inserted(element,binding){
            // console.log(element);
            // console.log(binding);
            element.innerHTML = binding.value;
            binding.value = binding.value;
        },
        update(element,binding){
            // console.log(element);
            // console.log(binding);
            element.innerHTML = binding.value+binding.oldValue;
            binding.value = binding.oldValue;
            // element.innerHTML = binding.value;
        }
    })
    var vm = new Vue({
        el:"#app",
        data() {
            return {
                sum:0,
                sums:1,
                sum1:0,
                sum2:1,
            }
        },
        directives:{
            "nums-ing"(element,binding){
                // console.log(element);
                // console.log(binding);
                element.innerHTML = binding.value+100;
            },
            "nums":{
                bind(element,binding){
                    // console.log(element);
                    // console.log(binding);
                },
                inserted(element,binding){
                    // console.log(element);
                    // console.log(binding);
                    element.innerHTML = binding.value+100;
                    binding.value = binding.value+100;
                },
                update(element,binding){
                    // console.log(element);
                    // console.log(binding);
                    element.innerHTML = binding.value+binding.oldValue;
                    binding.value = binding.oldValue;
                }
            }
        },
        methods: {
            func(){
                this.sum++;
                this.sums++;
                this.sum1 += 2;
                if(this.sum2%2==1){
                    this.sum2 += 2;
                }else{
                    this.sum2 += 1;
                }
            }
        },
    })
</script>

六.二级联动和computed计算属性

<div id="app">
        <input type="text" v-model="a">
        <input type="text" v-model="b">
        <!-- 1.使用插值做计算 -->
        <!-- <h1>{{a-b}}</h1> -->
        <!-- <h1>{{a}}-{{b}}</h1> -->
        <!-- 2.methods操作计算 -->
        <!-- <h1>{{func()}}</h1> -->
        <h1>{{fullDate}}</h1>
        <input type="checkbox" v-model="fullDate">
        <input type="text" v-model="fullName">
        <input type="text" v-model="fullNames">
        <hr>
        <!-- 2级联动 -->
        <select name="" id="" v-model="num">
            <option v-for="(item,index) of arr" :value="index" :key="index+item">{{item}}</option>
            <!-- <option value="0">江西</option>
            <option value="1">湖南</option>
            <option value="2">广东</option> -->
        </select>
        <!-- <button @click="func1()">点击</button> -->
        <select name="" id="">
            <option v-for="(item,index) of arrs[num]" :key="item+index" value="index">{{item}}</option>
        </select>
    </div>
<script src="../vue.js"></script>
<script>
    Vue.config.productionTip = false;
    var vm = new Vue({
        el:"#app",
        data() {
            return {
                a:0,
                b:0,
                // num:"1",
                arr:["江西","湖南","广东"],
                arrs:[
                    ["南昌","吉安","抚州","赣州"],
                    ["长沙","株洲","怀化","岳阳"],
                    ["广州","深圳","佛山","潮汕"]
                ]
            }
        },
        computed:{
            num:{
                get(){
                    console.log("触发了get");
                    return 2;
                },
                set(value){
                    console.log(value);
                    console.log(this.num);
                    // this.num = value;
                    console.log("触发了set");
                }
            },
            fullDate:{
                get(){
                    // console.log("触发了get");
                    // return this.a-this.b;
                    return true;
                },
                set(value){
                    console.log(value);
                    console.log("触发了set");
                }
            },
            fullNames:{
                get(){
                    // console.log("触发了get");
                    // return this.a-this.b;
                    return 199;
                },
                set(value){
                    console.log(value);
                    console.log("触发了set");
                }
            },
            fullName(){
                // console.log("简写的计算方法触发了");
                return 99;
            }
        },
        directives:{

        },
        methods: {
            func(){
                // return this.a-this.b;
                return this.a+"-"+this.b
            },
            // func1(){
            //     this.num="2";
            // }
        },
    })
    // let obj = {
    //     name:"张三",
    //     age:18,
    //     sex:"男"
    // }
    // obj.sclNum = 202201;
    // obj["a"] = 110;
    // Object.defineProperty(obj,"b",{
    //     // value:10,
    //     // enumerable:true,
    //     // writable:true,
    //     // configurable:true,
    //     get(){
    //         console.log("触发了get方法");
    //         return 10;
    //     },
    //     set(value){
    //         console.log(value);
    //         console.log("触发了set方法");
    //     }
    // });
    // console.log(obj.b);
    // obj.b = 20;
    // console.log(obj);
    // Vue的MVVM模型,数据代理
    // MVVM与MVC区别
    // 1.VM(vue)==C(调服务)
    // 2.MVVM双向(双向绑定,数据代理),MVC单向(直接操作DOM)
    // 3.MVVM(虚拟DOM)更快渲染,MVC单向(真实DOM)
</script>

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值