Vue的常用指令

一、逻辑相关 v-if

我们可以通过v-if、v-else-if、v-else来对页面元素的条件进行判断输出

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
<div v-if="'one' === message2">hhh</div>
<div v-else-if="'two' == message2">jjj</div>
<div v-else>{{message3}}</div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            message1: 'one',
            message2: 'two',
            message3: 'three'
        }
    });
</script>
</body>
</html>

效果如图:


二、循环遍历:v-for指令

我们可以使用v-for指令来遍历得到vue实例中data属性的值

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div id="app">
        <ul >
            <li v-for="student in students">{{student.name}}的年龄是:{{student.age}}岁</li>
        </ul>
        </div>

        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var vm = new Vue({
                el: "#app",
                data: {
                    students: [
                        {name:'xiaoming',age: 18},
                        {name: 'xiaohong',age: 19},
                        {name: 'xiaolan',age: 10}
                    ]
                }
            });
        </script>
    </body>
</html>

效果如图:


需要注意的点:

1. 创建数组对象时,格式为 [ {对象1} , {对象2} ,{对象3} ...]
2. 我们还可以在v-for指令中拿到当前item的索引:

<div id="app">
        <ul >
            <li v-for="(student,index) in students">{{index + 1}} {{student.name}}的年龄是:{{student.age}}岁</li>
       // 注意,index默认从0开始取值
        </ul>
        </div>

        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var vm = new Vue({
                el: "#app",
                data: {
                    students: [
                        {name:'xiaoming',age: 18},
                        {name: 'xiaohong',age: 19},
                        {name: 'xiaolan',age: 10}
                    ]
                }
            });
        </script>

结果如图:


三、v-show指令

我们可以通过v-show指令来控制某个元素的显示和隐藏

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div id="app">
            <p v-show="flag">小米是个大帅比</p>
        <button v-on:click="hide">点击控制语句的显示和隐藏</button>
        </div>

        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var vm = new Vue({
                el: "#app",
                data: {
                    flag: true
                },
                methods:{
                    hide: function(){
                        this.flag=!this.flag;
                    }
                }
            });
        </script>
    </body>
</html>

点击前:


点击后:

补充:v-show控制元素是否显示,实质上是通过元素的display属性的修改来进行修正
当不显示时,display属性的值为:none

四、事件绑定:v-on指令

v-on用于监听指定元素的DOM事件,比如点击事件。绑定事件监听器

  • 语法:v-on:click="say" or v-on:click="say('参数', $event)"
  • 简写:@click="say"
  • 说明:绑定的事件从methods中获取
  • 修饰符:
.stop - 调用 event.stopPropagation().prevent - 调用 event.preventDefault().capture - 添加事件侦听器时使用 capture 模式。
.self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
.{keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调。
.native - 监听组件根元素的原生事件。
.once - 只触发一次回调。
.left - (2.2.0) 只当点击鼠标左键时触发。
.right - (2.2.0) 只当点击鼠标右键时触发。
.middle - (2.2.0) 只当点击鼠标中键时触发。
.passive - (2.3.0){ passive: true } 模式添加侦听器
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div id="app">
            <button @click="sayHi()">Click Me</button>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var vm = new Vue({
                el: "#app",
                methods: {
                    sayHi: function(){
                        alert('Hello , Vue')
                    }
                }
            });
        </script>
    </body>
</html>

效果如图:


五、v-text和v-html

我们可以通过v-text和v-html两个指令来实现对vue对象文本内容的获取,二者的区别在于使用v-html指令可以动态的渲染文本中的html元素,而v-text指令只会将内容识别为文本

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div id="app">
            <div v-text="message"></div>
            <!-- 等同于下面这句 -->
            {{message}}
            <div v-text="text"></div>
            
            <div v-html="text"></div>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var vm = new Vue({
                el: "#app",
                data: {
                    message: 'Hello, Vue~',
                    text: "<button>Click Me</button>"
                }   
            });
        </script>
    </body>
</html>

效果如图:


六、属性绑定:v-bind

v-on:用于监听指定元素的DOM事件,比如点击事件。绑定事件监听器。

  • 缩写::
  • 预期:any (with argument) | Object (without argument)
  • 参数:attrOrProp (optional)
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div id="app">
            <a v-bind:href="url">点击跳转百度</a>
            <img  v-bind:src="imgSrc"/>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var vm = new Vue({
                el: "#app",
                data: {
                    url: 'http://www.baidu.com',
                    imgSrc: 'https://cn.vuejs.org/images/logo.png'
                }
            });
        </script>
    </body>
</html>

效果如图:


当然啦,更多的时候,我们是使用v-bind来绑定我们的组件,进行值的传递~

七、数据的双向绑定:v-model

v-model 指令在表单 <input>、<textarea> 及 <select> 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div id="app">
            
            <input type="text" v-model="message"/>
            <div>{{message}}</div>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var vm = new Vue({
                el: "#app",
                data: {
                    message: 'Hello , Vue~'
                }
            });
        </script>
    </body>
</html>


我们可以看到,通过v-model指令,表单元素获取到了vue实例的data数据。
那么怎么样可以证明v-model确实实现了双向绑定呢?我们可以通过修改文本框的内容来进行验证

当我们修改文本框中的内容时,vue实例中的对象值也被改变了

八、插槽:v-slot

对于插槽,可能刚开始接触的人会感觉比较陌生或者不好理解。
对于插槽的理解可以看一下下面这段话:
插槽,也就是slot,是组件的一块HTML模板,这块模板显示不显示、以及怎样显示由父组件来决定。 实际上,一个slot最核心的两个问题在这里就点出来了,是显示不显示和怎样显示。
或者简单理解的话,插槽就是在我们的页面代码中留下了一个入口,入口的代码可以由我们自己去定义内容

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <div id="app">
        <!-- 使用我们的自定义模板 -->
        <first-component>
            <component-title slot="component-title" v-bind:title="title"></component-title>
            <component-content slot="component-content" v-bind:good="good" v-for="good in goods"></component-content>
        </first-component>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            //自定义组件框架
            Vue.component("first-component",{
                template: '<div>\
                <slot name="component-title"></slot>\
                    <ul>\
                        <slot name="component-content"></solt>\
                    </ul>\
                </div>'
            })
            //自定义标题组件
            Vue.component("component-title",{
                props:['title'],
                template:'<div>{{title}}</div>'
            })
            //自定义内容组件
            Vue.component("component-content",{
                props:['good'],
                template:'<div>{{good}}</div>'
            })
            var vm = new Vue({
                el: "#app",
                data: {
                    title: '商品清单',
                    goods:['零食','纸巾','矿泉水']
                }
                
            });
        </script>
    </body>
</html>

效果如图:


关于slot的内容,可以参考文章:
https://www.jianshu.com/p/0c9516a3be80
https://blog.csdn.net/DDDDeng_/article/details/107475920

posted @ 2020-08-18 08:34  moutory  阅读(5)  评论(0编辑  收藏  举报  来源