谷粒商城学习日记(20)——Vue语法入门(4)


可参考文档
vue官方api

计算属性和侦听器

格式

Vue对象里面声明
computed:{} 计算属性
watch:{} 侦听器

 new Vue({
            el: "#app",
            data: {
              
            },
            computed: {
               
            },
            watch: {
               
            }
        })
    </script>

示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <!-- 某些结果是基于之前数据实时计算出来的,我们可以利用计算属性。来完成 -->
        <ul>
            <li>西游记; 价格:{
   
   {xyjPrice}},数量:<input type="number" v-model="xyjNum"> </li>
            <li>水浒传; 价格:{
   
   {shzPrice}},数量:<input type="number" v-model="shzNum"> </li>
            <li>总价:{
   
   {totalPrice}}</li>
            {
   
   {msg}}
        </ul>
    </div>
    <script src="../node_modules/vue/dist/vue.js"></script>

    <script>
        //watch可以让我们监控一个值的变化。从而做出相应的反应。
        new Vue({
     
     
            el: "#app",
            data: {
     
     
                xyjPrice: 99.98,
                shzPrice: 98.00,
                xyjNum: 1,
                shzNum: 1,
                msg: ""
            },
            computed: {
     
     
                totalPrice(){
     
     
                    return this.xyjPrice*this.xyjNum + this.shzPrice*this.shzNum
                }
            },
            watch: {
     
     
                xyjNum(newVal,oldVal){
     
     
                    if(newVal>=3){
     
     
                        this.msg = "库存超出限制";
                        this.xyjNum = 3
                    }else{
     
     
                        this.msg = "";
                    }
                }
            },
        })
    </script>

</body>

</html>

过滤器

过滤器常用来处理文本格式化的操作。过滤器可以用在两个地方:双花括号插值和 v-bind 表达式

可以使用局部定义的方式和全局定义的方式使用

局部使用方式

引用方式
{ {值 | 过滤器名}}

</script>
 let vm = new Vue({
            el: "#app",
            data: {
            },
            filters: {
                //  filters 定义局部过滤器,只可以在当前vue实例中使用
            }
        })
 </script>

全局使用方式

 <script>
        Vue.filter("gFilter", function (val) {
     
     
        })
</script>

示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <!-- 过滤器常用来处理文本格式化的操作。过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 -->
    <div id="app">
        <ul>
            <li v-for="user in userList">
                {
   
   {user.id}} ==> {
   
   {user.name}} ==> {
   
   {user.gender == 1?"男":"女"}} ==>
                {
   
   {user.gender | genderFilter}} ==> {
   
   {user.gender | gFilter}}
            </li>
        </ul>
    </div>
    <script src="../node_modules/vue/dist/vue.js"></script>

    <script>

        Vue.filter("gFilter", function (val) {
     
     
            if (val == 1) {
     
     
                return "男~~~";
            } else {
     
     
                return "女~~~";
            }
        })

        let vm = new Vue({
     
     
            el: "#app",
            data: {
     
     
                userList: [
                    {
     
      id: 1, name: 'jacky', gender: 1 },
                    {
     
      id: 2, name: 'peter', gender: 0 }
                ]
            },
            filters: {
     
     
                //  filters 定义局部过滤器,只可以在当前vue实例中使用
                genderFilter(val) {
     
     
                    if (val == 1) {
     
     
                        return "男";
                    } else {
     
     
                        return "女";
                    }
                }
            }
        })
    </script>
</body>

</html>

自定义组件

在大型应用开发的时候,页面可以划分成很多部分。往往不同的页面,也会有相同的部分。
例如可能会有相同的头部导航。
但是如果每个页面都自开发,这无疑增加了我们开发的成本。所以我们会把页面的不同分拆分成立的组件,然后在不同页面就可以共享这些组件,避免重复开发。
在vue里,所有的vue实例都是组件

组件其实也是一个vue实例,因此它在定义时也会接收:data、methods、生命周期函等
不同的是组件不会与页面的元素绑定(所以不写el),否则就无法复用了,因此没有el属性。
但是组件渲染需要html模板,所以增加了template属性,值就是HTML模板
全局组件定义完毕,任何vue实例都可以直接在HTML中通过组件名称来使用组件了
data必须是一个函数,不再是一个对象。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>

    <div id="app">

        <!-- 每个对象都是独立统计的 -->
        <counter></counter>
        <counter></counter>
 

        <button-counter></button-counter>
    </div>
    <script src="../node_modules/vue/dist/vue.js"></script>


    <script>
        //1、全局声明注册一个组件 // counter标签,代表button
        Vue.component("counter", {
     
     
            template: `<button v-on:click="me()">我被点击了 {
      
      {count}} 次</button>`,
            data() {
     
     
                return {
     
     
                    count: 1 // 数据
                }
            },
            methods: {
     
     
                me(){
     
     
                   this.count ++;     
                }
            }
        });

        //2、局部声明一个组件
        const buttonCounter = {
     
     
            template: `<button v-on:click="count++">我被点击了 {
      
      {count}} 次~~~</button>`,
            data() {
     
     
                return {
     
     
                    count: 1
                }
            }
        };

        new Vue({
     
     
            el: "#app",
            data: {
     
     
                count: 1
            },
            components: {
     
      // 要用的组件
                'button-counter': buttonCounter
            }
        })
    </script>
</body>

</html>

猜你喜欢

转载自blog.csdn.net/menxinziwen/article/details/115009818