Vue从入门到放弃笔记(2)——稍微复杂点的例子(入门级计数器)

   HelloWorld程序是新手村的哥布林,想快速升级就得刷复杂点的怪物。今天我们来看看能丢火的哥布林和牛头人(ntr)=-=。

 

     这个例子是简单学习下Vue的事件处理。回想原始的Js和Jquery,要想处理事件,一般分两步:

      1.找到需要触发的事件源控件,为其绑定事件监听函数(比如一个button元素,  它有一个onclick事件属性);

      2.在函数里面写要处理的逻辑(比如把‘Hello, Vue’替换成‘lz很帅‘)。

     我们在上一篇笔记中其实已经做过类似的事情——把app.message的值修改,页面内容也跟着修改。那么在Vue中如何处理事件呢? 答案很简单,就是指令。

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

<head>
    <meta charset="UTF-8">
    <title>vue-helloworld</title>
</head>

<body>
    <div id="app">
       {{message}}
       <button v-on:click="message='是的你很帅'">说我帅</button>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: "#app",
            data: {
                message: "Hello, Vue!"
            }
        });
    </script>
</body>

</html>

这个很简单,也很有趣,就是通过v-on指令给button绑定click事件,字符串里面的是事件的逻辑,这里我只是简单地通过修改message的值改了下文本内容。下面看看复杂点的,如何实现一个手动计数器。

点击+按钮计数器显示1,如果点击-,那么计数器显示-1。稍微想一想,其实代码并不难写:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>counter</title>
</head>
<body>
    <div id="app">
        <h3>计数器:{{counter}}</h3>
        <button v-on:click="counter++">+</button>
        <button v-on:click="counter--">-</button>
     </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                counter: 0
            }
        });
    </script>
</body>
</html>

效果达到了,但是肯定有朋友会问:事件逻辑不会这么简单,我要是想写复杂点的逻辑难道都写在v-on:click=""的引号里面?我想给它设定阈值比如到0就不让减该怎么做呢? 这个问题问得好,我一个朋友也这么问我。其实分析一下,不难得出,引号里面就是事件的逻辑代码,而js中函数是一等公民,那么能不能把逻辑封装在函数中再把函数扔到引号中去呢?我们来试一下:

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

<head>
    <meta charset="UTF-8">
    <title>counter</title>
</head>

<body>
    <div id="app">
        <h3>计数器:{{counter}}</h3>
        <button v-on:click="increase">+</button>
        <button v-on:click="decrease">-</button>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                counter: 0
            },
            methods: {
                increase: function () {
                    this.counter++;
                    console.log('我加一了!');
                },

                decrease: function () {
                    if (this.counter > 0) {
                        this.counter--;
                    } else {
                        console.log('我不能减了');
                    }
                }
            }
        });
    </script>
</body>

</html>

结果还真可以,我们用到了Vue对象中新属性methods,在里面定义了我们的事件函数。函数里面可写的逻辑就多了,不过要注意函数内部是不能直接引用counter变量的,因为全局上下文中没有一个叫counter的变量,这里用到了this。这里我遇到一个问题,将事件函数写成箭头函数的方式就没有效果,后来打印出来才发现是undefined,聪明的你肯定知道原因了,我要找找原因。

    decrease:  () => {
                    console.log(this.counter);
              
                    if (this.counter > 0) {
                        this.counter--;
                    } else {
                        console.log('我不能减了');
                    }
                }

另外关于click事件,有个简洁点的写法“@click”,更加简洁:

<button @click="decrease">-</button>

待续...

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章