一个Java后端的Vue自学笔记

JavaScript的强大不必多言。做为一名后端开发工程师,不会前端是不行的,这年头走哪都讲究个全栈么。Angular、React、Vue等js库的出现,彻底颠覆了后端开发对前端的认识。本人最近自学了一些Vue的皮毛,写下这篇博客不是为了哗众取宠,权当是为自己做一个Vue学习笔记。这篇博客主要记录了我学习Vue基础知识,完成一个TodoList小功能的开发过程。

首先进入Vue的官网下载Vue.js(Vue官网下载)开发版本,由于是学习基础知识,就不使用CDN了。保存vue.js之后,新建index.html文件:

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>Vue入门</title>  
    <script src="./vue.js"></script>  
</head>  
<body>  
<!-- -->  
    <div id="root">{{msg}}</div>  
          
    <script>  
        var my_vue = new Vue({  
<span style="white-space:pre;">     </span>el:"#root",  
<span style="white-space:pre;">     </span>data:{  
<span style="white-space:pre;">         </span>msg:"hello world"  
<span style="white-space:pre;">     </span>}  
        })  
    </script>  
</body>  
</html>  

在这个index.html文件中,使用引入<script>将刚才下载的vue.js嵌套进来。创建一个id="root"的div,称之为挂载点,然后在js代码中创建名为my_vue的vue实例( var my_vue = new Vue({...}) ),其中el表示接管的DOM对象,此时我们创建的my_vue就和这个div进行了绑定。我们还在my_vue中定义了data,其中msg的值为"hello world",而在div中接收时,需要使用{{msg}}(插值表达式)的形式进行接收。浏览器中的效果如图:

image

我们还可以在my_vue中定义模板template,在其中可以指定具体的html内容,此时挂载点中内容就是模板中的内容。

在data中还可以定义其他的数据,在挂载点中用v-text或v-html的形式进行显示:

<h1 v-text="msg"></h1>
<h1 v-html="msg"></h1>  

二者的区别在于v-text会进行转译,而v-html不会

vue中可以使用@符号对元素绑定事件,例如@click,然后在vue实例中添加methods,在其中定义具体的方法:

<h1 @click="handleClick">{{msg}}</h1>  
...  
var v1 = new Vue({  
    el:"#root",  
    data:{  
        msg:"hello world"  
    },  
    methods:{  
        handleClick:function(){  
            this.msg = "你好,世界"  
        }  
    }  
})  

此时,点击"hello world"之后,其内容就会变成"你好,世界"。这里,我们发现一个现象,当msg的值改变之后,我们不需要直接操作dom,vue实例会监听到数据的改变,自动对dom进行更新,页面也自动发生了改变。

我们可以使用 : 进行属性的绑定,将vue实例中的数据绑定到挂载点的属性值中。使用v-model指令进行双向绑定,即页面中的值发生改变时,会改变vue实例中的值:

...  
<input v-model="content"/>  
<div>{{content}}</div>  
...  
var v1 = new Vue({  
     el:"#root",  
     data:{  
          content:"this is content"  
     }  
})  

可以使用computed指令表示计算属性,使用watch指令表示侦听器

<div id="root">  
    <div>  
        <input v-model="firstName"/>  
        <input v-model="lastName"/>  
        <div>{{fullName}}</div>  
        <div>{{count}}</div>  
    </div>  
</div>  
<script>  
     var v1 = new Vue({  
        el:"#root",  
        data:{  
            firstName:"",  
            lastName:"",  
            count:0  
        },  
        computed:{  
            fullName:function(){  
                return this.firstName +" "+ this.lastName  
            }  
        },  
        watch:{  
            fullName:function(){  
                return this.count++  
            }  
        }  
    })  
</script> 

上面这段代码中,fullName就是计算属性,它是通过firstName和lastName计算得来,而侦听器的作用是当fullName发生时,使count加1

我们可以使用v-ifv-show来控制元素的显示与否,二者的区别在于:当传入的显示值是false时,v-if会在页面上将控制的dom删除掉,而v-show会改变dom的css为display:none

<div id="root">  
    <div v-if="show">hello world</div>  
    <div v-show="show">你好,世界</div>  
    <button @click="handleClick">toggle</button>  
</div>  
<script>  
    var v1 = new Vue({  
        el:"#root",  
        data:{  
            show:true  
        },  
        methods:{  
            handleClick:function(){  
                this.show = !this.show  
            }  
        }  
    })  
</script>

使用v-for来循环展示list:

<div id="root">  
    <ul>  
        <li v-for="(item,index) of list" :key="index">{{item}}</li>  
    </ul>  
</div>  
<script>  
  
    var v1 = new Vue({  
        el:"#root",  
        data:{  
            list:[1,2,3]  
        }  
    })  
  
</script>   

其中item表示循环中具体的每一项元素,index表示该元素的下标,这里我们需要为循环体指定一个key属性以提高渲染的效率,这里使用index作为key的值(实际上这不是一个好的选择)

现在,我们需要明白组件的概念。组件其实就是指页面上的某一部分。在Vue中,组件就是实例,实例就是组件。组件之间也是可以互相通信的。可以使用下面的代码定义一个全局组件:

<script>  
  
    Vue.component('todo-item',{  
        template:'<li>abc</li>'  
    })  
</script>  

最后,进行一个TodoList的功能的开发,附上代码:

<!DOCTYPE html>  
<html lang="en">  
<head>  
        <meta charset="UTF-8">  
        <title>Vue入门3.4-11111TodoList的删除功能-----</title>  
        <script src="./vue.js"></script>  
</head>  
<body>  
  
<div id="root">  
            <div>  
                <input v-model="inputValue"/>  
                <button @click="handleSubmit">提交</button>  
            </div>  
            <ul>  
                <!--<li v-for="(item,index) of list" :key="index">{{item}}</li>-->  
               <todo-item v-for="(item,index) of list"  
                :key="index"  
                :content="item"  
                :index="index"  
                @delete="handleDelete"    
               ></todo-item><!--订阅   监听delete   监听之后调用handleDelete方法-->  
            </ul>  
              
        </div>  
          
        <script>  
              
            Vue.component('todo-item',{  
                props:['content','index'],  
                template:'<li @click="handleClick">{{content}}</li>',  
                methods:{  
                    handleClick:function(){  
                        this.$emit('delete',this.index);    //发布   标志为delete  
                    }     
                }  
            })  
              
            var v1 = new Vue({  
                el:"#root",  
                data:{  
                    inputValue:"",  
                    list:[]  
                },  
                methods:{  
                    handleSubmit:function(){  
                        if(this.inputValue.trim() == ""){  
                            alert("请输入内容");  
                            this.inputValue = "";  
                            return ;  
                        }  
                        this.list.push(this.inputValue);  
                        this.inputValue="";  
                    },  
                    handleDelete:function(index){  
                        this.list.splice(index,1);  
                    }  
                }  
            })  
              
        </script>  
  
</body>  
</html>  

在这段代码中,我们实现了TodoList非常简单的功能:在input框中输入内容,点击提交之后,就会以ul的形式展示出来,当点击ul中的li时,就会将其删除掉。

首先我们使用v-model指令将input框的值和vue实例v1中的inputValue进行了双向绑定,然后提供了提交按钮的click事件和方法。然后我们定义了名为'todo-item'的组件,在其中定义了其模板是一个li标签,并对其进行了v-for循环。在todo-item元素中,我们给了他一个属性content其值为item,也就是循环的list中的元素,而这个content元素是通过父组件传给他的,所以需要写成:content(我们可以认为id="root"的div为父组件,而todo-item为子组件),同样的,父组件通过index属性将循环中的index传给了子组件。而子组件想要接收content和index这两个属性,就需要在props中定义(props:['content','index'])而这就是父子组件之间的通信:父组件将值以属性的形式传给子组件。然后,子组件再其模板中将content元素以差值表达式的形式显示出来。这样我们就实现TodiList的添加功能。

而要实现TodoList的删除功能,我们首先需要明确,其实我们就是通过子组件的click时间,将自己的下标告诉父组件,然后在父组件中将list中的对应下标的一项删掉即可,而这就是父子组件之间的通信:子组件将值传给父组件。这里我们需要用到发布/订阅模式,在子组件的每一个li中,我们已经从父组件那里接收到了自己的index值,所以只需要定义一个handleClick方法,在这个方法中,我们使用发布模式(this.$emit('delete',this.index)),以delete为标记,将index值发布出去。而在父组件中,通过@delete的形式发起订阅,当监听到delete的发布之后,调用父组件自身的handleDelete方法,然后在该方法中将list中对应的元素删除即可。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • 在这个世界里,生活就是禁锢与逃离,我们憧憬着安静地享受食物,奔跑着感受着生命,我们渴望着或拥有着爱,但这一切都只是...
    Lizol_Zoeshy阅读 165评论 0 0
  • 夏末秋初,中元节上,漫步阑珊,有微微寒风。一个人,蹉跎于繁华,有滴滴细雨,氤氲了思念。 曾无数次地想,山和水可以相...
    关雎长乐阅读 417评论 2 5
  • 这段时间深度接触游戏力,它的力量实在让人惊叹,它给我带来的神奇,就如同给彭妹的袋鼠式育儿法,把自己和宝宝的衣服一脱...
    博妈优姐阅读 551评论 2 4
  • 宝宝好奇心系列,全4册,70元 我们的身体+我们的生活+可爱的动物+奇妙的自然科技!适合2-6岁中幼儿童,孩子们来...
    拉依德麻麻阅读 328评论 0 0