关键词搜索

源码搜索 ×
×

前端笔记-Vue框架的基本认识

发布2019-07-18浏览5724次

详情内容

目录

 

 

基本概念

div与vue实例绑定

挂载点,模板,实例之间的关系

插入页面的其他写法

模板指令

Vue中的属性绑定和双向数据绑定

Vue中的计算属性和侦听器

v-if,v-show,v-for指令

TodoList功能开发

TodoList中组建的拆分

TodoList的删除


 

基本概念

目前有个功能,要使用到前端,本来是用Bootstrap的,但领导要求要用vue框架来做,本来还有的情绪,但在继续学习spring boot开发,使用前端的时候,发现大家都是使用vue,而且一般后端发送json数据,vue来解析,这的确是非常方便,比Bootstrap好了很多倍。今天特意花一天时间来初步学习下vue这个创建。

 

div与vue实例绑定

程序运行截图如下:

源码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  7. <head>
  8. <body>
  9. <div id="root">{{msg}}</div>
  10. <script>
  11. new Vue({
  12. el: "#root",
  13. data: {
  14. msg: "How old are you"
  15. }
  16. })
  17. </script>
  18. </body>
  19. </html>

这里是创建vue实例与html上的元素进行绑定

el:让vue的实例接管哪一个element,上面的代码是接管root;

data:为vue实例里面的数据。

 

挂载点,模板,实例之间的关系

如下代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  7. <head>
  8. <body>
  9. <div id="root"></div>
  10. <script>
  11. new Vue({
  12. el: "#root",
  13. template: '<h1>Hello! {{msg}} The number is {{number}}</h1>',
  14. data: {
  15. msg: "How old are you",
  16. number: 10086
  17. }
  18. })
  19. </script>
  20. </body>
  21. </html>

运行截图如下:

挂载点:就是html中的div的那个root就为挂载点;

实例:script中new Vue就是一个实例;

模板:挂载点内部的内容都称之为模板,如上面的template。

挂载点用于显示数据,实例用于存储数据和其他绑定,模板用于提供数据。

 

插入页面的其他写法

插值法:{{}}

代码就是上面的那些!

v-text显示

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  7. <head>
  8. <body>
  9. <div id="root" v-text="msg"></div>
  10. <script>
  11. new Vue({
  12. el: "#root",
  13. //template: '<h1>Hello! {{msg}} The number is {{number}}</h1>',
  14. data: {
  15. msg: "How old are you",
  16. number: 10086
  17. }
  18. })
  19. </script>
  20. </body>
  21. </html>

运行截图如下:

v-html显示

源码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  7. <head>
  8. <body>
  9. <div id="root" v-html="content"></div>
  10. <script>
  11. new Vue({
  12. el: "#root",
  13. //template: '<h1>Hello! {{msg}} The number is {{number}}</h1>',
  14. data: {
  15. msg: "How old are you",
  16. content: "<h1>How are you<h1>"
  17. number: 10086
  18. }
  19. })
  20. </script>
  21. </body>
  22. </html>

运行截图如下:

这里v-html主要用与当有<h1>这种修饰的。

 

模板指令

如果有这样的一种功能,点击源码中的<h1>标签内容,然后变成How old are you

使用v-on来绑定点击事件:

点击后:

源码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. <div v-on:click="handleClick"><h1>{{content}}</h1></div>
  11. </div>
  12. <script>
  13. new Vue({
  14. el: "#root",
  15. data: {
  16. content: "How are you"
  17. },
  18. methods: {
  19. handleClick: function(){
  20. this.content = "How old are you"
  21. }
  22. }
  23. })
  24. </script>
  25. </body>
  26. </html>

这里可以简写把v-on简写成@

源码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. <div @click="handleClick"><h1>{{content}}</h1></div>
  11. </div>
  12. <script>
  13. new Vue({
  14. el: "#root",
  15. data: {
  16. content: "How are you"
  17. },
  18. methods: {
  19. handleClick: function(){
  20. this.content = "How old are you"
  21. }
  22. }
  23. })
  24. </script>
  25. </body>
  26. </html>

 

Vue中的属性绑定和双向数据绑定

html中有个title,当鼠标移动上去会有tip显示:

源码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. <div title="hehehehehehehda"><h1>呵呵</h1></div>
  11. </div>
  12. <script>
  13. new Vue({
  14. el: "#root"
  15. })
  16. </script>
  17. </body>
  18. </html>

v-bind指XXX属性和什么数据项绑定

源码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. <div v-bind:title="title"><h1>呵呵</h1></div>
  11. </div>
  12. <script>
  13. new Vue({
  14. el: "#root",
  15. data: {
  16. title: "呵呵呵额和"
  17. }
  18. })
  19. </script>
  20. </body>
  21. </html>

用一个input框,输入数据后修改h1标签的内容 这样进行双向数据绑定。

其中v-bind:可以简写为 : 这个符号

使用v-model可以实现双向绑定

下面代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. <input v-model="content" />
  11. <div><h1>{{content}}</h1></div>
  12. </div>
  13. <script>
  14. new Vue({
  15. el: "#root",
  16. data: {
  17. title: "呵呵呵",
  18. content: "mmp"
  19. }
  20. })
  21. </script>
  22. </body>
  23. </html>

运行截图如下:

 

Vue中的计算属性和侦听器

先构造如下页面,输入姓名后,会在上面显示:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. 姓:<input v-model="firstName" />
  11. 名:<input v-model="lastName" />
  12. <div><h1>{{firstName}}{{lastName}}</h1></div>
  13. </div>
  14. <script>
  15. new Vue({
  16. el: "#root",
  17. data: {
  18. firstName: '',
  19. lastName: ''
  20. }
  21. })
  22. </script>
  23. </body>
  24. </html>

运行截图如下:

还可以通过这种方式:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. 姓:<input v-model="firstName" />
  11. 名:<input v-model="lastName" />
  12. <div><h1>{{fullName}}</h1></div>
  13. </div>
  14. <script>
  15. new Vue({
  16. el: "#root",
  17. data: {
  18. firstName: '',
  19. lastName: ''
  20. },
  21. computed: {
  22. fullName: function(){
  23. return this.firstName + this.lastName
  24. }
  25. }
  26. })
  27. </script>
  28. </body>
  29. </html>

下面说下侦听器,当修改了input后,Vue中的count属性会加1

使用watch关键字!

运行截图如下:

代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. 姓:<input v-model="firstName" />
  11. 名:<input v-model="lastName" />
  12. <div><h1>{{fullName}}</h1></div>
  13. <div><h1>{{count}}</h1></div>
  14. </div>
  15. <script>
  16. new Vue({
  17. el: "#root",
  18. data: {
  19. firstName: '',
  20. lastName: '',
  21. count: 0
  22. },
  23. computed: {
  24. fullName: function(){
  25. return this.firstName + this.lastName
  26. }
  27. },
  28. watch:{
  29. fullName: function(){
  30. this.count ++
  31. }
  32. }
  33. })
  34. </script>
  35. </body>
  36. </html>

 

v-if,v-show,v-for指令

如果有下面这个需求,点击按钮text就影藏,再点击就显示!

如下源码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. <div v-if="show"><h1>Hello world</h1></div>
  11. <button @click="handleClick">toggle</button>
  12. </div>
  13. <script>
  14. new Vue({
  15. el: "#root",
  16. data: {
  17. show: true
  18. },
  19. methods: {
  20. handleClick: function(){
  21. this.show =! this.show;
  22. }
  23. }
  24. })
  25. </script>
  26. </body>
  27. </html>

运行截图如下:

点击后:

同样,使用这种方式也是可以的,至少看起来是一样的

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. <div v-show="show"><h1>Hello world</h1></div>
  11. <button @click="handleClick">toggle</button>
  12. </div>
  13. <script>
  14. new Vue({
  15. el: "#root",
  16. data: {
  17. show: true
  18. },
  19. methods: {
  20. handleClick: function(){
  21. this.show =! this.show;
  22. }
  23. }
  24. })
  25. </script>
  26. </body>
  27. </html>

使用v-show,实际上并没有从dom树上删除,而是加了一个display: none的属性值。

从性能上面来说,v-show的确要高些,因为他不用被销毁。

下面来看看v-for,做一个循环展示:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. <ul>
  11. <li v-for="item of list">{{item}}</li>
  12. </ul>
  13. </div>
  14. <script>
  15. new Vue({
  16. el: "#root",
  17. data: {
  18. list: [1, 2, 3]
  19. }
  20. })
  21. </script>
  22. </body>
  23. </html>

运行截图如下:

这里有个小技巧,输入:key可以提升每一个item的渲染性能,并且添加index会得到下标:

代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. <ul>
  11. <li v-for="(item, index) of list" :key="item">{{item}} {{index}}</li>
  12. </ul>
  13. </div>
  14. <script>
  15. new Vue({
  16. el: "#root",
  17. data: {
  18. list: ['球球', '腿腿', '米线']
  19. }
  20. })
  21. </script>
  22. </body>
  23. </html>

运行截图如下:

 

TodoList功能开发

要做一个功能,一个输入框一个提交,点击提交,数据就会在列表中;

运行截图如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. <input v-model="inputValue"/>
  11. <button @click="handleSubmit">提交</button>
  12. <ul>
  13. <li v-for="(item, index) of list" :key="index">
  14. {{item}}
  15. </li>
  16. </ul>
  17. </div>
  18. <script>
  19. new Vue({
  20. el: "#root",
  21. data: {
  22. inputValue: "Hello",
  23. list: []
  24. },
  25. methods:{
  26. handleSubmit: function(){
  27. this.list.push(this.inputValue)
  28. this.inputValue = ""
  29. }
  30. }
  31. })
  32. </script>
  33. </body>
  34. </html>

 

TodoList中组建的拆分

组建:页面上的某一个部分。

通过组建,但项目比较大的时候,一般企业都应该采用的方式;

把上面的TodoList改成组建的形式:

使用Vue.component进行组建的注册,这个组建是一个全局的组建。

使用 var TodoItem = {

          template: '<li>item</li>'

}

这种是局部组建,需要在vue中做一个声明

components:{

}

如下的全局组建:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. <input v-model="inputValue"/>
  11. <button @click="handleSubmit">提交</button>
  12. <ul>
  13. <todo-item></todo-item>
  14. </ul>
  15. </div>
  16. <script>
  17. Vue.component('todo-item', {
  18. template: '<li>呵呵</li>'
  19. })
  20. new Vue({
  21. el: "#root",
  22. data: {
  23. inputValue: '',
  24. list: []
  25. },
  26. methods:{
  27. handleSubmit: function(){
  28. this.list.push(this.inputValue)
  29. this.inputValue = ""
  30. }
  31. }
  32. })
  33. </script>
  34. </body>
  35. </html>

运行截图如下:

局部组建:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. <input v-model="inputValue"/>
  11. <button @click="handleSubmit">提交</button>
  12. <ul>
  13. <todo-item></todo-item>
  14. </ul>
  15. </div>
  16. <script>
  17. //Vue.component('todo-item', {
  18. // template: '<li>呵呵</li>'
  19. //})
  20. var TodoItem = { template: '<li>item</li>' }
  21. new Vue({
  22. el: "#root",
  23. components: {
  24. 'todo-item': TodoItem
  25. },
  26. data: {
  27. inputValue: '',
  28. list: []
  29. },
  30. methods:{
  31. handleSubmit: function(){
  32. this.list.push(this.inputValue)
  33. this.inputValue = ""
  34. }
  35. }
  36. })
  37. </script>
  38. </body>
  39. </html>

接收从外部传来的content属性:

源码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. <input v-model="inputValue"/>
  11. <button @click="handleSubmit">提交</button>
  12. <ul>
  13. <todo-item v-for="(item, index) of list" :key="index" :content="item"></todo-item>
  14. </ul>
  15. </div>
  16. <script>
  17. Vue.component('todo-item', {
  18. props: ['content'],
  19. template: '<li>{{content}}</li>'
  20. })
  21. new Vue({
  22. el: "#root",
  23. data: {
  24. inputValue: '',
  25. list: []
  26. },
  27. methods:{
  28. handleSubmit: function(){
  29. this.list.push(this.inputValue)
  30. this.inputValue = ""
  31. }
  32. }
  33. })
  34. </script>
  35. </body>
  36. </html>

注意,在Vue中每一个组建都是Vue的实例。

 

TodoList的删除

使用handleSubmit实现删除的功能:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <head>
  8. <body>
  9. <div id="root">
  10. <input v-model="inputValue"/>
  11. <button @click="handleSubmit">提交</button>
  12. <ul>
  13. <todo-item v-for="(item, index) of list" :key="index" :content="item"
  14. :index="index" @delete="handleDelete"></todo-item>
  15. </ul>
  16. </div>
  17. <script>
  18. Vue.component('todo-item', {
  19. props: ['content', 'index'],
  20. template: '<li @click="handleClick">{{content}}</li>',
  21. methods:{
  22. handleClick: function(){
  23. //触发后发送事件
  24. this.$emit('delete', this.index)
  25. }
  26. }
  27. })
  28. new Vue({
  29. el: "#root",
  30. data: {
  31. inputValue: '',
  32. list: []
  33. },
  34. methods:{
  35. handleSubmit: function(){
  36. this.list.push(this.inputValue)
  37. this.inputValue = ""
  38. },
  39. handleDelete: function(index){
  40. this.list.splice(index, 1)
  41. }
  42. }
  43. })
  44. </script>
  45. </body>
  46. </html>

这种套路和Qt有点像,今天的基本认识就到这里了,这个笔记真的丰富啊

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载