今日内容概要

  • 属性指令
  • style和class
  • 条件渲染
  • 列表渲染
  • 事件处理
  • 数据的双向绑定
  • v-model进阶
  • 购物车案例

内容详细

1、属性指令

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="js/vue.js"></script>
  7. <style>
  8. .red {
  9. background: red;
  10. }
  11. .green {
  12. background: green;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <div id="app">
  18. <button @click="changeBac">点我变色</button>
  19. <!-- <p v-bind:class="p_class">{{name}}</p>-->
  20. <p :class="p_class">{{name}}</p>
  21. <button @click="changePhoto">点我切换美女</button>
  22. <div>
  23. <img :src="url" alt="" width="400px" height="400px">
  24. </div>
  25. </div>
  26. </body>
  27. <script>
  28. var vm = new Vue({
  29. el: "#app",
  30. data: {
  31. name: '阿祖',
  32. p_class: 'red',
  33. url: 'https://tva1.sinaimg.cn/large/00831rSTly1gd1u0jw182j30u00u043b.jpg',
  34. },
  35. methods: {
  36. changeBac() {
  37. this.p_class = 'green'
  38. },
  39. changePhoto() {
  40. this.url = 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fup.enterdesk.com%2Fedpic%2F09%2F3a%2Fbc%2F093abce7b31f4c8ffdbf345375ff4abb.jpg&refer=http%3A%2F%2Fup.enterdesk.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1652321528&t=3709d1c880107a53d265f936022f0d53'
  41. }
  42. }
  43. })
  44. </script>
  45. </html>



2、style和class

  1. # 属性指令中比较特殊的有style和class
  2. class 可以对应字符串,数组(推荐),对象
  3. style 可以对应字符串,数组,对象(推荐)
  4. # 语法:
  5. :属性名=js变量/js语法
  6. :class=’js变量、字符串、js数组’
  7. class:三目运算符、数组、对象{red: true}
  8. :style=’js变量、字符串、js数组’
  9. style:三目运算符、数组[{backgreound: red’},]、对象{background: red’}
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. <style>
  8. .red {
  9. background: red;
  10. }
  11. .font {
  12. font-size: 60px;
  13. text-align: center;
  14. }
  15. .green {
  16. background: green;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <div id="app">
  22. <h1 :class="h1_class">我是class的h1</h1>
  23. <h1 :style="h1_style">我是style的h1</h1>
  24. </div>
  25. </body>
  26. <script>
  27. var vm = new Vue({
  28. el: "#app",
  29. data: {
  30. // class 可以对应字符串,数组(推荐),对象
  31. // h1_class:'green font',
  32. // h1_class:['green',] //在控制台给h1_class添加一个元素
  33. h1_class: {'green': true, 'font': false},
  34. // style 可以对应字符串,数组,对象(推荐)
  35. // h1_style:'background: pink;font-size:80px'
  36. // h1_style:[{background:'pink'},{'font-size':'100px'}],
  37. // h1_style:[{background:'pink'},{fontSize:'200px'}], // 不用引号,就要使用驼峰
  38. // h1_style:{background:'red','font-size':'40px'},
  39. h1_style: {background: 'red', fontSize: '40px'},
  40. },
  41. })
  42. </script>
  43. </html>

3、条件渲染

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <h2>您的成绩是:</h2>
  11. <p v-if="score>90">优秀</p>
  12. <p v-else-if="score>80">良好</p>
  13. <p v-else-if="score>60">及格</p>
  14. <p v-else>不及格</p>
  15. </div>
  16. </body>
  17. <script>
  18. var vm = new Vue({
  19. el: "#app",
  20. data: {
  21. score: 99,
  22. },
  23. })
  24. </script>
  25. </html>

4、列表渲染

4.1 v-if+v-for+v-else控制购物车商品的显示

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <h1>购物车如下</h1>
  11. <div v-if="good_list.length>0">
  12. <table border="1">
  13. <tr>
  14. <td>商品名字</td>
  15. <td>商品价格</td>
  16. </tr>
  17. <tr v-for="good in good_list">
  18. <td>{{good.name}}</td>
  19. <td>{{good.price}}</td>
  20. </tr>
  21. </table>
  22. </div>
  23. <div v-else>
  24. 购物车空空如也
  25. </div>
  26. </div>
  27. </body>
  28. <script>
  29. var vm = new Vue({
  30. el: "#app",
  31. data: {
  32. good_list: [{name: "特斯拉", price: 100203}, {name: "鸡蛋", price: 2}, {name: "猪肉", price: 35}]
  33. },
  34. })
  35. </script>
  36. </html>

4.2 v-for遍历数组(列表)、对象(字典)、数字

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <h1>购物车如下</h1>
  11. <div v-if="good_list.length>0">
  12. <table border="1">
  13. <tr>
  14. <td>商品名字</td>
  15. <td>商品价格</td>
  16. </tr>
  17. <tr v-for="good in good_list">
  18. <td>{{good.name}}</td>
  19. <td>{{good.price}}</td>
  20. </tr>
  21. </table>
  22. </div>
  23. <div v-else>
  24. 购物车空空如也
  25. </div>
  26. <hr>
  27. <h1>遍历对象(第一个是value,第二个是key)</h1>
  28. <p v-for="item in info">{{item}}</p>
  29. <hr>
  30. <p v-for="(v,k) in info" :key="k">key值是:{{k}}--value值是:{{v}}</p>
  31. <h1>遍历数组</h1>
  32. <ul>
  33. <li v-for="girl in girls">{{girl}}</li>
  34. </ul>
  35. <hr>
  36. <ul>
  37. <li v-for="(v,i) in girls">第{{i}}个女孩是:{{v}}</li>
  38. </ul>
  39. <h1>遍历数字,从1开始</h1>
  40. <p v-for="i in 5">第{{i}}个数字</p>
  41. </div>
  42. </body>
  43. <script>
  44. var vm = new Vue({
  45. el: "#app",
  46. data: {
  47. good_list: [{name: "特斯拉", price: 100203}, {name: "鸡蛋", price: 2}, {name: "猪肉", price: 35}],
  48. info: {name: 'lqz', age: 19, gender: '男'},
  49. girls: ['迪丽热巴', '刘亦菲', '杨颖', '糖宝']
  50. },
  51. })
  52. </script>
  53. </html>

4.3 注意

  1. # 注意!在Vue中:
  2. 数组的indexvalue是反的
  3. 对象的keyvalue也是反的
  4. # key值的解释
  5. 看到别人代码在循环时,写在标签中 :key='值'
  6. key:一般咱么在循环的时候,都要加 :key='值',值不要是固定的
  7. vue中使用的是虚拟DOM,会和原生的DOM进行比较,然后进行数据的更新,提高数据的刷新速度(虚拟DOM用了diff算法)
  8. v-for循环数组、对象时,建议在控件/组件/标签写1key属性,属性值唯一
  9. 页面更新之后,会加速DOM的替换(渲染)
  10. :key="变量"
  11. # key可以加速页面的替换--》key加上,效率高
  12. # 数组更新与检测
  13. # 数组追加一个值---页面里面跟着变
  14. 可以检测到变动的数组操作:
  15. push:最后位置添加
  16. pop:最后位置删除
  17. shift:第一个位置删除
  18. unshift:第一个位置添加
  19. splice:切片
  20. sort:排序
  21. reverse:反转
  22. 检测不到变动的数组操作---页面不会变
  23. filter():过滤
  24. concat():追加另一个数组
  25. slice():
  26. map():
  27. 原因:
  28. 作者重写了相关方法(只重写了一部分方法,但是还有另一部分没有重写)
  29. # 数组变了,但页面没变---》解决方案
  30. // 方法1:通过 索引值 更新数组(数据会更新,但是页面不会发生改变)
  31. vm.arrayList[0]
  32. "Alan"
  33. vm.arrayList[0]='Darker'
  34. "Darker"
  35. // 方法2:通过 Vue.set(对象, index/key, value) 更新数组(数据会更新,页面也会发生改变)
  36. Vue.set(vm.arrayList, 0, 'Darker')

5、数据的双向绑定

  1. # input标签---》跟js变量绑定
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <input type="text" v-model="text">--->{{text}}
  11. </div>
  12. </body>
  13. <script>
  14. var vm = new Vue({
  15. el: "#app",
  16. data: {
  17. text: ''
  18. },
  19. })
  20. </script>
  21. </html>

6、事件处理

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. change: <input type="text" v-model="text" @change="handleChange">
  11. <hr>
  12. input: <input type="text" v-model="text1" @input="handleInput">
  13. <hr>
  14. blur:<input type="text" v-model="text2" @blur="handleBlur">
  15. </div>
  16. </body>
  17. <script>
  18. var vm = new Vue({
  19. el: "#app",
  20. data: {
  21. text: '',
  22. text1: '',
  23. text2: '',
  24. },
  25. methods: {
  26. handleChange() {
  27. console.log('change触发:', this.text)
  28. },
  29. handleInput() {
  30. console.log('input触发:', this.text1)
  31. },
  32. handleBlur() {
  33. console.log('blur触发:', this.text2)
  34. },
  35. }
  36. })
  37. </script>
  38. </html>

6.1 过滤案例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <input type="text" v-model="text" @input="handleInput">---》{{text}}
  11. <ul>
  12. <li v-for="data in newdataList">{{data}}</li>
  13. </ul>
  14. </div>
  15. </body>
  16. <script>
  17. // 补充 filter
  18. // var newdataList = ['a', 'at', 'atom', 'be', 'beyond', 'cs', 'csrf']
  19. // var l = newdataList.filter(function (item) {
  20. // if (item.length > 2) {
  21. // return true
  22. // } else {
  23. // return false
  24. // }
  25. // })
  26. // console.log(l)
  27. // 补充:判断一个字符串是否在另一个字符串中
  28. // var text = 'at'
  29. // var newdataList = ['a', 'at', 'atom', 'be', 'beyond', 'cs', 'csrf']
  30. // var l = newdataList.filter(function (item) {
  31. // var i = item.indexOf(text)
  32. // if (i >= 0) {
  33. // return true
  34. // } else {
  35. // return false
  36. // }
  37. // })
  38. // 同上 --简写
  39. // var l = newdataList.filter(function (item) {
  40. // return item.indexOf(text) >= 0
  41. // })
  42. // console.log(l)
  43. // 箭头函数 -es6
  44. // var a = function (name) {
  45. // console.log(name)
  46. // }
  47. // a('lqz')
  48. // 同上 --简写 箭头函数没有自己的this
  49. // var a = (name) => {
  50. // console.log(name)
  51. // }
  52. // a("lqz")
  53. var vm = new Vue({
  54. el: "#app",
  55. data: {
  56. text: '',
  57. dataList: ['a', 'at', 'atom', 'be', 'beyond', 'cs', 'csrf'],
  58. newdataList: ['a', 'at', 'atom', 'be', 'beyond', 'cs', 'csrf'],
  59. },
  60. methods: {
  61. handleInput() {
  62. console.log(this)
  63. // var _this = this
  64. // // 只要text发生变化,newdataList就变化,就过滤
  65. // this.newdataList = this.dataList.filter(function (item) {
  66. // // js 中this指向的问题
  67. // console.log(this)
  68. // return item.indexOf(_this.text) >= 0
  69. // })
  70. // es6 处理this指向,箭头函数
  71. this.newdataList = this.dataList.filter((item) => {
  72. // js 中this指向的问题
  73. console.log(this)
  74. return item.indexOf(this.text) >= 0
  75. })
  76. },
  77. }
  78. })
  79. </script>
  80. </html>

6.2 事件修饰符

  1. # 使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生
  2. v-on:click.prevent.self 会阻止所有的点击
  3. v-on:click.self.prevent 只会阻止对元素自身的点击
  4. # 事件冒泡:
  5. 子标签的点击事件,传到了父标签上

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <ul @click.self="handleUl">
  11. <li @click.stop="handleC('刘亦非')">刘亦菲</li>
  12. <li @click="handleC('杨颖')">杨颖</li>
  13. <li>迪丽热巴</li>
  14. </ul>
  15. <hr>
  16. <a href="http://www.baidu.com" @click.prevent="handleA">点我看美女</a>
  17. <hr>
  18. <button @click.once="handleSubmit">点我秒杀</button>
  19. </div>
  20. </body>
  21. <script>
  22. var vm = new Vue({
  23. el: "#app",
  24. data: {},
  25. methods: {
  26. handleUl() {
  27. console.log('ul被点解了')
  28. },
  29. handleC(name) {
  30. console.log(name, '被点击了')
  31. },
  32. handleA() {
  33. // 允许跳,不允许跳
  34. console.log('a被点击了')
  35. // location.href='http://www.baidu.com'
  36. },
  37. handleSubmit() {
  38. console.log('秒杀按钮被点击了')
  39. }
  40. }
  41. })
  42. </script>
  43. </html>

6.3 按键修饰符

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <!-- <input type="text" v-model="mytext" v-on:keyup="handleKeyUp">-&ndash;&gt;{{mytext}}-->
  11. <!-- 简写:-->
  12. <input type="text" v-model="mytext" @keyup="handleKeyUp($event)">--->{{mytext}}
  13. <hr>
  14. <input type="text" v-model="mytext" @keyup.enter="handleKeyUp2($event)">--->{{mytext}}
  15. </div>
  16. </body>
  17. <script>
  18. var vm = new Vue({
  19. el: "#app",
  20. data: {
  21. mytext: '',
  22. },
  23. methods: {
  24. handleKeyUp(event) {
  25. console.log(event)
  26. console.log(event.key, '被按下弹起了')
  27. if (event.key == 'Enter') {
  28. alert('美女你好')
  29. }
  30. },
  31. handleKeyUp2(event) {
  32. console.log(event.key, '被按下弹起了')
  33. },
  34. }
  35. })
  36. </script>
  37. </html>

7、表单控制

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <h1>checkbox单选</h1>
  11. <p>用户名:<input type="text" v-model="username"></p>
  12. <p>密码:<input type="password" v-model="password"></p>
  13. <p>记住密码:<input type="checkbox" v-model="remember"></p>
  14. <hr>
  15. {{username}}---{{password}}--{{remember}}
  16. <br>
  17. <h1>radio单选</h1>
  18. <input type="radio" v-model="radio" value="1">
  19. <input type="radio" v-model="radio" value="2">
  20. <input type="radio" v-model="radio" value="0">保密
  21. <br><br>您选择的性别:{{radio}}
  22. <hr>
  23. <h1>checkbox多选</h1>
  24. <input type="checkbox" v-model="many" value="篮球">篮球
  25. <input type="checkbox" v-model="many" value="足球">足球
  26. <input type="checkbox" v-model="many" value="棒球">棒球
  27. <input type="checkbox" v-model="many" value="桌球">桌球
  28. <br><br>您喜欢的球类:{{many}}
  29. </div>
  30. </body>
  31. <script>
  32. var vm = new Vue({
  33. el: "#app",
  34. data: {
  35. username: '',
  36. password: '',
  37. remember: true, // checkbox单选,布尔
  38. radio: '', // redio的单选字符串,对应选中的value值
  39. many: [], //checkbox多选---》数组
  40. },
  41. methods: {}
  42. })
  43. </script>
  44. </html>

8、v-model进阶

  1. # v-model 之 lazy、number、trim
  2. lazy:等待input框的数据绑定时区焦点之后再变化
  3. number:数字开头,只保留数字,后面的字母不保留;字母开头,都保留
  4. trim:去除首位的空格
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <script src="./js/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. lazy: <input type="text" v-model.lazy="username">--->{{username}}
  11. <br>
  12. number:<input type="text" v-model.number="age">--->{{age}}
  13. <br>
  14. trim:<input type="text" v-model.trim="info">--->{{info}}
  15. <br>
  16. </div>
  17. </body>
  18. <script>
  19. var vm = new Vue({
  20. el: "#app",
  21. data: {
  22. username: '',
  23. age: '',
  24. info: '',
  25. },
  26. methods: {}
  27. })
  28. </script>
  29. </html>

前端vue之属性指令、style和class、条件渲染、列表渲染、事件处理、数据双向绑定、表单控制、v-model进阶的更多相关文章

  1. 前端笔记之微信小程序(二){{}}插值和MVVM模式&数据双向绑定&指令&API

    一.双花括号{{}}插值和MVVM模式 1.1 体会{{}}插值 index.wxml的标签不是html的那些标签,这里的view就是div. {{}}这样的插值写法,叫做mustache语法.mus ...

  2. vue指令:v-model绑定表单控件;v-model与v-bind结合使用

    一.v-model绑定表单控件 v-model 双向数据绑定:一般用于表单元素,会忽略表单元素的value.checked.selected的初始值,且将Vue实例的数据作为数据来源. 1. 单行文本 ...

  3. 对象的属性类型 和 VUE的数据双向绑定原理

    如[[Configurable]] 被两对儿中括号 括起来的表示 不可直接访问他们 修改属性类型:使用Object.defineProperty()  //IE9+  和标准浏览器  支持 查看属性的 ...

  4. 【学习笔记】剖析MVVM框架,简单实现Vue数据双向绑定

    前言: 学习前端也有半年多了,个人的学习欲望还比较强烈,很喜欢那种新知识在自己的演练下一点点实现的过程.最近一直在学vue框架,像网上大佬说的,入门容易深究难.不管是跟着开发文档学还是视频教程,按步骤 ...

  5. vue中v-model 数据双向绑定

    表单输入绑定 v-model 数据双向绑定,只能应用在input /textare /select <div id="app"> <input type=&quo ...

  6. 【vue2】Style和Class,条件,列表渲染,双向数据绑定,事件处理

    目录 1.style和class 2. 条件渲染 2.1 指令 2.2 案例 3. 列表渲染 3.1 v-for:放在标签上,可以循环显示多个此标签 3.2 v-for 循环数组,循环字符串,数字,对 ...

  7. 西安电话面试:谈谈Vue数据双向绑定原理,看看你的回答能打几分

    最近我参加了一次来自西安的电话面试(第二轮,技术面),是大厂还是小作坊我在这里按下不表,先来说说这次电面给我留下印象较深的几道面试题,这次先来谈谈Vue的数据双向绑定原理. 情景再现: 当我手机铃声响 ...

  8. Vue数据双向绑定原理及简单实现

    嘿,Goodgirl and GoodBoy,点进来了就看完点个赞再go. Vue这个框架就不简单介绍了,它最大的特性就是数据的双向绑定以及虚拟dom.核心就是用数据来驱动视图层的改变.先看一段代码. ...

  9. 【Vue】-- 数据双向绑定的原理 --Object.defineProperty()

    Object.defineProperty()方法被许多现代前端框架(如Vue.js,React.js)用于数据双向绑定的实现,当我们在框架Model层设置data时,框架将会通过Object.def ...

随机推荐

  1. 『现学现忘』Docker基础 — 30、Docker中数据卷相关命令

    目录 1.Volume命令说明 2.Volume命令的使用 (1)创建数据卷 (2)查看本地数据卷列表 (3)打印myVolume数据卷的详细信息 (4)删除数据卷 (5)删除所有未使用的数据卷 3. ...

  2. kubernetes允许master调度

    1,让 Master 也当作 Node 使用 (1)如果想让 Pod 也能调度到在 Master(本样例即 localhost.localdomain)上,可以执行如下命令使其作为一个工作节点: 注意 ...

  3. 6月22日 Django中ORM的F查询和Q查询、事务、QuerySet方法大全

    一.F查询和Q查询 F查询 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较.F() 的实 ...

  4. SpringCloudAlibaba 微服务讲解(二)微服务环境搭建

    微服务环境搭建 我们这次是使用的电商项目的商品.订单.用户为案例进行讲解 2.1 案例准备 2.1.1 技术选型 maven :3.3.9 数据库:mysql 持久层:SpringData JPA S ...

  5. ServletConfig对象和ServletContext对象有什么区别?

    一个Servlet对应有一个ServletConfig对象,可以用来读取初始化参数. 一个webapp对应一个ServletContext对象. ServletContext对象获取初始化定义的参数. ...

  6. 模糊查询like语句该怎么写?

    第1种:在Java代码中添加sql通配符. string wildcardname = "%smi%"; list<name> names = mapper.selec ...

  7. MyBatis与Hibernate有哪些不同?

      (1)Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句. (2)Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活 ...

  8. java-开发规约

    public class TenTen { /** * 代码中的命名不能用下划线或美元符号开始和结束:例如 _name name_ $name name$ */ /** * 类名必须使用UpperCa ...

  9. springboot使用自定义注解和反射实现一个简单的支付

    优点: 未使用if else,就算以后增加支付类型,也不用改动之前代码 只需要新写一个支付类,给添加自定义注解@Pay 首先: 定义自定义注解 Pay 定义 CMBPay ICBCPay 两种支付 根 ...

  10. Effective Java —— 使类和成员的可访问性最小化

    本文参考 本篇文章参考自<Effective Java>第三版第十五条"Minimize the accessibility of classes and members&quo ...