vue——事件、样式绑定&条件、循环渲染&MVC和MVVM的区别

一、事件绑定

(一)方法

  • 在methods中写方法,供事件或别的方法内部调用

  方法的写法:

  • 所有的函数写法都可以:如下
  function fn4() {console.log("fn4")}
  var fn5 = () => {console.log("fn5")}
  var fn6 = function () {console.log("fn6")}

        var vm = new Vue({
            el: "#app",
            data: {
            },
            methods: {
                fn: function () {
                    console.log(1)
                },
                fm: () => {
                    console.log("鼠标移入 事件触发了")
                },
                fb() {
                    fn(),
                    fm()
                    //绑定一个事件执行两个事件
                },
                fn4,
                fn5,
                fn6
            },
        })

(二)事件绑定

  • v-on:event  和  @ 都是绑定事件的指令
  • 指令后面跟事件类型,值就是methds中的方法,可以加小括号也可以不加
 <div id="eg1">
        <h1> {{title}}</h1>
        <button v-on:click="fn()">change</button><br><br>
        <!-- <button v-on:click="fn">方法不带小括号</button><br> -->
        <button @click="fm1" @mouseenter="fm">hover打印-onclick弹窗</button><br><br>
        <button @click="fb">一个事件绑多个程序(change+onclick弹窗)</button>
    </div>
    <hr>

    <script>
        var vm = new Vue({
            //传入的data和method都被vm对象(this)劫持了 this===vm
            el: "#eg1",
            data: {
                title: "方法"
            },
            methods: {
                fn: function () {//es5
                    this.title = "事件"
                },
                fm: () => { //es6箭头函数
                    console.log("鼠标移入 事件触发了")
                },
                fm1: () => {
                    alert("弹窗啦")
                },
                fb() {//es6的方法
                    //绑定一个事件执行两个事件
                    this.fm1()
                    this.fn()
                },
            },
        })
    </script>

 结果显示:

(三)事件修饰符

  • .stop 阻止冒泡,阻止从当前元素经过的所有冒泡行为

  • .prevent 阻止默认事件

  • .capture 添加事件侦听器时让事件在捕获阶段触发

  • .self 其他元素的事件触发时 事件链经过它,无论是捕获还是冒泡阶段都不会触发它的事件,只有它自己是精准对象才会触发事件, 虽然它自己不会被别人影响,但是它自己的事件触发的时候还是会生成事件链经过其他元素,并不阻止继续冒泡到其他元素

  • .once 事件只触发一次,触发完之后,事件就解绑

  • 多修饰符可以一起使用:直接连点

    <div id="eg3">
        <!-- 阻止事件冒泡 -->
        <div class="box1" @click.capture.once="box1">1
            <div class="box2" @click.self.stop="box2">2
                <div class="box3" @click.stop="box3">3</div>
            </div>
        </div>
        <!-- 阻止a标签的默认事件 -->
        <a @click.prevent="fa" href="http://www.baidu.com">点击弹窗且不跳转百度</a>
    </div>

    <script>
        new Vue({
            el: "#eg3",
            data: {

            },
            methods: {
                box1() {
                    console.log(1)
                },
                box2() {
                    console.log(2)
                },
                box3() {
                    console.log(3)
                },
                fa(){
                    alert("阻止a标签的默认事件--跳转")
                }
            }
        })
    </script>

 结果显示:

二、样式绑定

(一)style绑定

<div id="eg1">
        <button @click="btnclicked">show/hidden</button>
        <div :style="{display:n,color:color}">{{msg}}</div>
        <div :style="obj">红色字体 30号字</div>
        <div :style="[a,b,{color:'lightblue',background:'pink'}]">{{msg1}}</div>
</div>
    <script>
        new Vue({
            el: "#eg1",
            data: {
                msg: "hello",
                msg1:"数组可以将多个样式绑定到同一对象上",
                flag: true,
                n: "block",
                color: "blue",
                obj: {
                    color: "red",
                    fontSize: "30px"
                },
                a: {
                    fontSize: "30px"
                },
                b: {
                    width: "200px",
                    height: "200px",
                },
            },
            methods: {
                btnclicked() {
                    this.flag = !this.flag
                    if (this.flag) {
                        //显示
                        this.n = "block"
                        this.color = "pink"
                    } else {
                        //隐藏
                        this.n = "none"
                    }
                }
            },
        })
    </script>

 结果显示:

(二)class绑定

 <div id="eg3">
        <button @click="btnclicked">{{title}}</button>
        <div :class="['mainbox',mode]">
            <p>切换阅读时的背景颜色</p>
            <p>字体颜色</p>
        </div>
</div>
<hr>

    <script>
        new Vue({
            el: "#eg3",
            data: {
                title: "护眼模式",
                flag: true,
                mode: "huyan",
            },
            methods: {
                btnclicked() {
                    //开关思想
                    this.flag = !this.flag
                    if (this.flag) {
                        this.title = "护眼模式",
                            this.mode = "huyan"

                    } else {
                        this.title = "夜间模式",
                            this.mode = "black"
                    }
                }
            },
        })
    </script>

 结果显示:

三、条件渲染

  • 在业务中常常可以通过操作if或者show使用的变量,来达到操作元素显示和隐藏的效果
  • 使用的变量为true就显示,false就隐藏          

v-if:删除节点(移除元素),移除的元素不会创建到渲染树中,不会占用内存中

v-show:操作css的display:none来达到操作元素显示和隐藏的效果

根据它们底层的设计不一样有各自的使用场景

  •  v-if具有较高的 切换(渲染)消耗,常常用在不常切换的模块 
  •  v-show具有较高的 性能(内存)消耗,常常用在频繁切换的模块中 如tabbar  
 <div id="eg1">
        <button @click="change">开关</button>
        <div v-if="condition">v-if的开关显示效果</div>
        <div v-show="condition">v-show的开关显示效果</div>
 </div>
   
    <script>
        new Vue({
            el: "#eg1",
            data: {
                //condition可以是任意表达式和值 ==> if(condition) 为false时解绑
                condition: false,
            },
            methods: {
                change() {
                    this.condition = !this.condition
                }
            },
        })
    </script>

  v-if结果显示:

 

 v-show结果显示:


           

 

四、循环渲染

  • v-for

  • v-for:所在的元素及其子元素都会被克隆(克隆次数为循环次数)

(1)第一层

<div id="eg1">
        <span v-for="(el,index) in arr">{{el}}</span>
        <hr>
        <div v-for="(el,index) in json">
            <span>{{el.name}}</span>
            <span>{{el.age}}</span>
        </div>
        <hr>
        <div v-for="(el,index) in qiantao">
            <h1>{{el.city}}</h1>
            <div v-for="el2 in el.area">{{el2}}</div>
        </div>
        <hr>
</div>

    <script>
        new Vue({
            el: "#eg1",
            data: {
                arr: ["hello", "!", "vue", ".", "js"],
                json: [{
                    name: "haha",
                    age: 21
                }, {
                    name: "xixi",
                    age: 22
                }, {
                    name: "yaya",
                    age: 23
                }, ],
                qiantao: [{
                    city: "重庆",
                    area: ["长寿", "江北"]
                }, {
                    city: "成都",
                    area: ["金牛", "锦江"]
                }, {
                    city: "昆明",
                    area: []
                }, ]
            },
        })
    </script>

 结果显示:

 (2)第二层

在vue2.0中,当v-if 和v-for 出现在一个标签时   v-for 的优先级更高

     解决:1.写成嵌套关系 把v-for写到v-if中 会多一个空元素(v-if所在的)

                2.“冰元素” template标签

在vue3.0中,不允许写到一排 会直接报错

 <div id="eg3">
        <div v-for="(el,index) in json">
            <template v-if="el.age>21">
                <span>{{el.name}}</span>
            </template>
        </div> 
    </div>

    <script>
        new Vue({
            el: "#eg3",
            data: {
                json: [{
                    name: "haha",
                    age: 21
                }, {
                    name: "xixi",
                    age: 22
                }, {
                    name: "yaya",
                    age: 23
                }, ]
            },
        })
    </script>

  结果显示:

 

五、MVC和MVVM(面试)

MVC与MVVM之间的区别

(1)MVC

在实际应用开发场景中,开发者常用的一种设计模式是MVC(eg:node(后端)中的MVC设计模式):

  • M(Model):数据模型层。是应用程序中用于处理应用程序数据逻辑的部分,模型对象负责在数据库中存取数据。

  • V(View):视图层。是应用程序中处理数据显示的部分,视图是依据模型数据创建的。

  • C(Controller):控制层。是应用程序中处理用户交互的部分,控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

(2)MVVM

  • M(Model):模型层。就是业务逻辑相关的数据对象,通常从数据库映射而来,我们可以说是与数据库对应的model。

  • V(View):视图层。就是展现出来的用户界面。

  • VM(ViewModel):视图模型层。就是与界面(view)对应的Model。因为,数据库结构往往是不能直接跟界面控件一一对应上的,所以,需要再定义一个数据对象专门对应view上的控件。而ViewModel的职责就是把model对象封装成可以显示和接受输入的界面数据对象。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈ha~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值