vue指令、计算属性、过滤器的使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、指令
    • 1.v-text与v-html指令
    • 2.v-bind与v-model指令
    • 3.v-for指令
  • 二、计算属性
  • 三、filters过滤器


前言

        Vue是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。

你可以用不同的方式使用 Vue:

  • 无需构建步骤,渐进式增强静态的 HTML
  • 在任何页面中作为 Web Components 嵌入
  • 单页应用 (SPA)
  • 全栈 / 服务端渲染 (SSR)
  • Jamstack / 静态站点生成 (SSG)
  • 开发桌面端、移动端、WebGL,甚至是命令行终端中的界面

一、指令

        指令(Directives)是Vue.js模板中最常用的一项功能,HTML元素仅仅是界面的呈现,若还需要和Vue实例进行交互,就需要用到Vue.js的指令。在Vue.js中,指令必须写在HTML元素中,以前缀v-开头,后缀用来区分指令的功能,前缀和后缀通过短横线连接,它是Vue实例数据与用户界面之间的纽带。

Vue.js内置了很多指令,帮助开发者快速完成常见的DOM操作,譬如显示与隐藏、循环渲染等等,需要先了解一些常用的指令,如v-text、v-html、v-cloak、v-bind、v-on等。


        Vue是一个 JavaScript 框架,所以,如果想使用Vue,则在当前页面引入Vue.js文件即可。

<script src="../js/vue.js"></script>

<script src="../js/vue.js"></script>

 1.v-text指令与v-html指令

        v-text用来在DOM元素内部插入文本内容,该指令以文本的方式更新元素的内容,即使是HTML代码,它也只当做普通字符串处理,不会解析标签。v-html用来在DOM元素内部插入HTML代码内容。某些情况下,从服务器请求到的数据本身就是一个HTML代码,如果直接通过“{{}}”来输出,会将HTML代码也一起输出。总结起来,v-text更新元素的文本内容,而v-html更新元素的innerHTML。

我们来看一段代码,代码如下:

<div id="app">
     <p v-text="age">ss</p>
     <!-- v-html -->
     <p v-html="age">fvs</p>
 </div>
 <script>
        new Vue({
            el:'#app',
            data:{
                    age:"<h1>18</h1>"
            }
        })
</script>

在这里运行出来的结果是怎样的呢? v-text它不会解析标签,虽然上面写着html代码,但是它也只当作普通字符来处理,不会解析他的标签,而v-html会将html代码一起输出,因此代码运行出来是这样的:

以上便是v-text与v-html区别。

 2.v-bind指令与v-model指令 

        v-bind指令用于实现单向动态数据绑定。除了标签内容需要动态来渲染外,某些标签的属性也希望动态来绑定,这时就可以使用v-bind动态绑定属性。v-model指令主要用于实现表单元素和数据的双向绑定,通常用在表单类元素上(如input、select、textarea等)。所谓双向绑定,指的就是Vue实例中的data与其渲染的DOM元素上的内容保持一致,两者无论谁被改变,另一方也会相应的同步更新为相同的数据。

v-bind可以省略v-bind,简写为一个冒号“:” ,如下所示:

        <!-- 完整写法 -->

        <img v-bind:src="img" />

        <!-- 简写 -->

        <img :src="img" />

那么单向绑定和双向绑定具体是什么意思呢?接下来我们看一个例子。

首先,我们写三个输入框,其中两个输入框用来表示单向绑定,另外一个输入框用来表示双向绑定,并且给用户名、密码里的输入框赋值。代码如下:

<div id="app">
    <div>
        用户名<input type="text" v-bind:value="username">
    </div>
    <div>
        密码<input type="text" v-bind:value="password">
    </div>
    <input type="text" v-model="name" placeholder=“请输入用户名”>
</div>
<script>
        new Vue({
            el:"#app",
            data(){
                return{
                    username:"admin",
                    password:123456,
                    name:""
                }
            }
        })
</script>

运行效果如下所示: 

从中我们可以看到, 我们把用户名与密码赋上了确定的值,接下来我们试试修改一下用户名与密码,我们看看效果。

 可以很明显的看出,改变左边的用户名与密码之后,右边的username与password并没有改变,那么这个就是单向数据绑定了,一边改变之后,并没有把值传给另外一边。下面我们看看第三个输入框。

我改变了两次数据 ,第一次是改变输入框的值,第二次是去控制台改变了值,并且两次都传值给了另外一边,这便实现了表单元素和数据的双向绑定。两边无论谁被改变,另外一边也会同步相应的数据。

案例:使用v-bind指令实现菜单的选中效果。(思考:当鼠标选中一个菜单栏目,如何判断出选的是哪一个菜单栏目),需要实现效果如图:

思路:首先,我们需要数据绑定, 然后根据选择下标去显示我们所选择的菜单栏目,并且显示出对应的样式。

先去定义一个变量,并且将它设置为0,然后通过点击事件去动态改变currentIndex下标,从而定位到菜单栏目。其中index为实参

<li :class="[currentIndex==index?'checked':'']" @click="change(index)"

             v-for="(item,index) in arr" :key="index">{{item}}</li>

代码如下: 

   <style>
        ul li{
            box-shadow: #ccc 0px 0px 8px;
            list-style: none;
            /* 去除列表符号 这里是去除li的符号 */
            width: 70px;
            height: 70px;
            line-height: 70px;
            /* 原理是在于将单行文字的行高设定后,文字会位于行高的垂直中间位置 */
            border-radius: 50%;
            box-sizing: border-box;
            margin-bottom: 20px;
            /* 距离底部20px */
            cursor: pointer;
            /* 鼠标变成手 */
        }
        .checked{
            color: #fff;
            background-color: #00aeff;
        }
    </style>
</head>
<body>
    <div id="app">
        <ul>
            <li :class="[currentIndex==index?'checked':'']" @click="change(index)"
             v-for="(item,index) in arr" :key="index">{{item}}</li>
        </ul>
    </div>

    <script>
        new Vue({
            el:"#app",
            data(){
                return{
                    currentIndex:0,
                    arr:["最新课程","热门推荐","课程分类","热门职业","名师简介"]
                }
            },
            methods:{
                //index  形参
                change(index) {
                    //点击的时候 动态改变currentIndex  0 1 2 3 4
                    this.currentIndex=index;
                }
            }
        })
    </script>

 3.v-for指令

        我们可以使用v-for指令基于一个数组来渲染一个列表。v-for是Vue.js的循环语句,当需要遍历数组或对象时,常用的就是列表渲染指令v-for,它需要结合着in或者of来使用。v-for 指令的值需要使用 item in items 形式的特殊语法,items是源数据的数组,而 item是迭代项的别名。index是迭代到的当前元素索引,从0开始。

        v-for="item in items"

        v-for="(item,index)in items"

在 v-for块中可以完整地访问父作用域内的属性和变量。v-for 也支持使用可选的第二个参数表示当前项的位置索引。 

        v-for="item in items" 

        v-for="(item,index)in items"
(1)for循环普通数组 

代码如下:

            <li v-for="(item,index) of fruit" :key="index">
            索引值index:{{index}}----每一项item:{{item}}
            </li>

<div id="app">
        <ul>
            <li v-for="(item,index) of fruit" :key="index">
            </li>
        </ul>
 </div>
 <script>
        new Vue({
            el:'#app',
            data:{
                    fruit:["西瓜","火龙果","草莓","葡萄"] 
            }
        })
</script>

运行效果如图:

(2)for循环对象数组

代码如下:

            <li v-for="(value,key,index) of apple" :key="index">
                属性索引:{{index}}----属性名:{{key}}---属性值:{{value}}
            </li>

<div id="app">
        <ul>
            <li v-for="(value,key,index) of apple" :key="index">
            </li>
        </ul>
 </div>
 <script>
        new Vue({
            el:'#app',
            data:{
                apple:{
                    name:"苹果",color:"红色"
                }
            }
        })
</script>

运行效果如图:

(3) for循环对象

代码如下:

<div id="app">
        <ul>
            <li v-for="count of 10">
                这是第{{count}}次循环
            </li>
        </ul>
 </div>
 <script>
        new Vue({
            el:'#app',
            data:{
                    //fruit:["西瓜","火龙果","草莓","葡萄"] 
            }
        })
</script>

运行效果如图: 

         

        下面我们来看一个案例来更加灵活使用v-for指令。

        案例:请使用v-for指令遍历数组["小学","初中","高中","大学"],并将数据渲染到网页的列表中。执行效果如下:

代码如下: 

 <div id="app">
        <ul>
            <!-- item代表数组每一项 -->
            <!-- index代表数组的下标 -->
            <li v-for="(item,index) of study" :key="index" >
                {{item}}
            </li>
        </ul>
    </div>
    <script>
        new Vue({
            el:"#app",
            data:{
                study:["小学","初中","高中","大学"],
            }
        })
    </script>

其中,<li v-for="(item,index) of study" :key="index" >也可以写成<li v-for="(item,index) in study" :key="index" >,两者都可以进行遍历。

运行效果如图:

二、计算属性computed

        计算属性的本质其实就是一个方法,只不过在使用的时候可以直接当做属性来使用。具体有以下特点:

  • 计算属性在使用时不需要加(),直接写名称即可;

  • 如果计算属性用到了data中的数据,当data数据发生变化时,就会立即重新计算这个计算属性的值;

  • 计算属性在第一次使用时的结果会被缓存起来,直到属性中所依赖的data数据发生改变计算属性的结果才会重新求值;


        那么计算属性和方法有什么区别呢?

        Vue实例中的methods也可以完成计算的功能,与计算属性的作用相同。那么为什么在做计算的时候通常选择计算属性而不选择方法呢?因为计算属性是基于他的依赖缓存的,所以只有当其依赖的数据发生改变的时候,才会重新求值。这就意味着,只要依赖的数据没有发生改变,多次访问计算属性就会立即返回之前的计算结果,不必再次执行函数。而methods不同,他每调用一次就执行一次函数,所以computed 和 methods相比,computed有缓存,性能开销小。

接下来我们来看一个案例:

输入三门科目的分数,显示对应的平均分与总分。

 我们先写好他的表格样式

        <table class="gridtable">
            <tr>
                <th>学科</th>
                <th>分数</th>
            </tr>
            <tr>
                <td>语文</td>
                <td><input type="text" placeholder="请输入你的语文成绩" v-model.number="chinese"/></td>
            </tr>
            <tr>
                <td>数学</td>
                <td><input type="text" placeholder="请输入你的数学成绩" v-model.number="math"/></td>
            </tr>
            <tr>
                <td>英语</td>
                <td><input type="text" placeholder="请输入你的英语成绩" v-model.number="english"/></td>
            </tr>
            <tr>
                <td>总分</td>
                <td><input type="text" v-bind:value="totalScore"/></td>
            </tr>
            <tr>
                <td>平均分</td>
                <td><input type="text" v-bind:value="avgScore"/></td>
            </tr>
        </table>

当一个结果受多个值影响时候就需要用到computed,最典型的例子: 购物车商品结算的时候。我们需要利用computed来定义总分与平均分。

    <script>
        new Vue({
            el:"#app",
            data(){
                return{
                    chinese:"",
                    math:"",
                    english:""
                }
            },
            methods:{

            },
            computed:{
                totalScore(){
                    var sum=this.chinese+this.math+this.english;
                    return sum;
                },
                avgScore(){
                    var avg=(this.chinese+this.math+this.english)/3;
                    return this.totalScore/3
                    
                }
            }
        })
    </script>

其中totalScore用来定义总分,avgScore用来定义平均分。 

三、filters过滤器

        在Vue.js中提供了一种过滤器,它可以对数据进行过滤处理,它的作用一般是用于一些常见的文本格式化,即 修饰文本,并根据过滤的条件返回需要的结果,过滤器通常由管道符"|"进行标识。过滤器一般可以用在两个地方:双花括号{{}}或v-bind表达式中。它分为全局过滤器和局部过滤器。当全局过滤器和局部过滤器重名时,会采用局部过滤器。过滤器函数必须接收表达式的值 (之前的操作链的结果) 作为第一个参数。

         过滤器在模板语法{{}} 或v-bind 中使用,并且过滤器,computed 必须要有返回值。接下来我们来看一个非常简单的案例以便于大家理解。

我们需要实现以上效果,在‘200’前面加上符号‘¥’。

    <div id="app">
        {{money|addIcon}}
    </div>
    <script>
        var wm=new Vue({
            el:"#app",
            data(){
                return{
                    money:200
                }
            },
            methods:{

            },
            filters:{
                addIcon(val){
                    return "¥"+val
                }
            }
        })

总结
        例如:以上就是今天要讲的内容,本文仅仅简单介绍了指令、计算属性computed、filters过滤器。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值