• Vue2复习3 绑定样式 条件渲染 列表渲染 Key作用与原理,列表过滤排序,Vue监测数据改变的原理_对象


    绑定样式
     1. class样式、
    写法:class="xxx" xxx可以是字符串、对象、数组。
    字符串写法适用于:类名不确定,要动态获取。
    对象写法适用于:要绑定多个样式,个数不确定,名字也不确定。
    数组写法适用于:要绑定多个样式,个数确定,名字也确定,但不确定用不用。
     2. style样式
    :style="{fontSize: xxx}"其中xxx是动态值。
    style="[a,b]"其中a、b是样式对象

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>绑定样式</title>
    6. <style>
    7. .basic{
    8. width: 400px;
    9. height: 100px;
    10. border: 1px solid black;
    11. }
    12. .happy{
    13. border: 4px solid red;;
    14. background-color: rgba(255, 255, 0, 0.644);
    15. background: linear-gradient(30deg,yellow,pink,orange,yellow);
    16. }
    17. .sad{
    18. border: 4px dashed rgb(2, 197, 2);
    19. background-color: gray;
    20. }
    21. .normal{
    22. background-color: skyblue;
    23. }
    24. .atguigu1{
    25. background-color: yellowgreen;
    26. }
    27. .atguigu2{
    28. font-size: 30px;
    29. text-shadow:2px 2px 10px red;
    30. }
    31. .atguigu3{
    32. border-radius: 20px;
    33. }
    34. </style>
    35. <script type="text/javascript" src="../js/vue.js"></script>
    36. </head>
    37. <body>
    38. <!-- 准备好一个容器-->
    39. <div id="root">
    40. <!-- 绑定class样式--字符串写法,适用于:样式的类名不确定,需要动态指定 -->
    41. <div class="basic" :class="mood" @click="changeMood">{{name}}</div> <br/><br/>
    42. <!-- 绑定class样式--数组写法,适用于:要绑定的样式个数不确定、名字也不确定 -->
    43. <div class="basic" :class="classArr">{{name}}</div> <br/><br/>
    44. <!-- 绑定class样式--对象写法,适用于:要绑定的样式个数确定、名字也确定,但要动态决定用不用 -->
    45. <div class="basic" :class="classObj">{{name}}</div> <br/><br/>
    46. <!-- 绑定style样式--对象写法 -->
    47. <div class="basic" :style="styleObj">{{name}}</div> <br/><br/>
    48. <!-- 绑定style样式--数组写法 -->
    49. <div class="basic" :style="styleArr">{{name}}</div>
    50. </div>
    51. </body>
    52. <script type="text/javascript">
    53. Vue.config.productionTip = false
    54. const vm = new Vue({
    55. el:'#root',
    56. data:{
    57. name:'zt',
    58. mood:'normal',
    59. classArr:['atguigu1','atguigu2','atguigu3'],
    60. classObj:{
    61. atguigu1:false,
    62. atguigu2:false,
    63. },
    64. styleObj:{
    65. fontSize: '40px',
    66. color:'red',
    67. },
    68. styleObj2:{
    69. backgroundColor:'orange'
    70. },
    71. styleArr:[
    72. {
    73. fontSize: '40px',
    74. color:'blue',
    75. },
    76. {
    77. backgroundColor:'gray'
    78. }
    79. ]
    80. },
    81. methods: {
    82. changeMood(){
    83. const arr = ['happy','sad','normal']
    84. const index = Math.floor(Math.random()*3)
    85. this.mood = arr[index]
    86. }
    87. },
    88. })
    89. </script>
    90. </html>

    条件渲染

    1.v-if
    写法:
       (1).v-if="表达式" 
       (2).v-else-if="表达式"
       (3).v-else="表达式"
    适用于:切换频率较低的场景。
      特点:不展示的DOM元素直接被移除。
      注意:v-if可以和:v-else-if、v-else一起使用,但要求结构不能被“打断”。

      2.v-show
       写法:v-show="表达式"
       适用于:切换频率较高的场景。
       特点:不展示的DOM元素未被移除,仅仅是使用样式隐藏掉
       3.备注:使用v-if的时,元素可能无法获取到,而使用v-show一定可以获取到。

     

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>条件渲染</title>
    6. <script type="text/javascript" src="../js/vue.js"></script>
    7. </head>
    8. <body>
    9. <!-- 准备好一个容器-->
    10. <div id="root">
    11. <h2>当前的n值是:{{n}}</h2>
    12. <button @click="n++">点我n+1</button>
    13. <!-- 使用v-show做条件渲染 -->
    14. <!-- <h2 v-show="false">欢迎来到{{name}}</h2> -->
    15. <!-- <h2 v-show="1 === 1">欢迎来到{{name}}</h2> -->
    16. <!-- 使用v-if做条件渲染 -->
    17. <!-- <h2 v-if="false">欢迎来到{{name}}</h2> -->
    18. <!-- <h2 v-if="1 === 1">欢迎来到{{name}}</h2> -->
    19. <!-- v-else和v-else-if -->
    20. <!-- <div v-if="n === 1">Angular</div>
    21. <div v-else-if="n === 2">React</div>
    22. <div v-else-if="n === 3">Vue</div>
    23. <div v-else>哈哈</div> -->
    24. <!-- v-if与template的配合使用 -->
    25. <template v-if="n === 1">
    26. <h2>你好</h2>
    27. <h2>zt</h2>
    28. <h2>北京</h2>
    29. </template>
    30. </div>
    31. </body>
    32. <script type="text/javascript">
    33. Vue.config.productionTip = false
    34. const vm = new Vue({
    35. el:'#root',
    36. data:{
    37. name:'zt',
    38. n:0
    39. }
    40. })
    41. </script>
    42. </html>

    列表渲染

    基本列表

    v-for指令:
    1.用于展示列表数据

    2.语法:v-for="(item, index) in xxx" :key="yyy"
    3.可遍历:数组、对象、字符串(用的很少)、指定次数(用的很少)

     

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>基本列表</title>
    6. <script type="text/javascript" src="../js/vue.js"></script>
    7. </head>
    8. <body>
    9. <!-- 准备好一个容器-->
    10. <div id="root">
    11. <!-- 遍历数组 -->
    12. <h2>人员列表(遍历数组)</h2>
    13. <ul>
    14. <li v-for="(p,index) of persons" :key="index">
    15. {{p.name}}-{{p.age}}
    16. </li>
    17. </ul>
    18. <!-- 遍历对象 -->
    19. <h2>汽车信息(遍历对象)</h2>
    20. <ul>
    21. <li v-for="(value,k) of car" :key="k">
    22. {{k}}-{{value}}
    23. </li>
    24. </ul>
    25. <!-- 遍历字符串 -->
    26. <h2>测试遍历字符串(用得少)</h2>
    27. <ul>
    28. <li v-for="(char,index) of str" :key="index">
    29. {{char}}-{{index}}
    30. </li>
    31. </ul>
    32. <!-- 遍历指定次数 -->
    33. <h2>测试遍历指定次数(用得少)</h2>
    34. <ul>
    35. <li v-for="(number,index) of 5" :key="index">
    36. {{index}}-{{number}}
    37. </li>
    38. </ul>
    39. </div>
    40. <script type="text/javascript">
    41. Vue.config.productionTip = false
    42. new Vue({
    43. el:'#root',
    44. data:{
    45. persons:[
    46. {id:'001',name:'张三',age:18},
    47. {id:'002',name:'李四',age:19},
    48. {id:'003',name:'王五',age:20}
    49. ],
    50. car:{
    51. name:'奥迪A8',
    52. price:'70万',
    53. color:'黑色'
    54. },
    55. str:'hello'
    56. }
    57. })
    58. </script>
    59. </html>

    Key作用与原理

    react、vue中的key有什么作用?(key的内部原理)

    1. 虚拟DOM中key的作用:

    key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】, 
     随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较,

    比较规则如下:

    (1).旧虚拟DOM中找到了与新虚拟DOM相同的key:

    ①.若虚拟DOM中内容没变, 直接使用之前的真实DOM!

    ②.若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实DOM。

    (2).旧虚拟DOM中未找到与新虚拟DOM相同的key

    创建新的真实DOM,随后渲染到到页面。

    3. 用index作为key可能会引发的问题:

    1. 若对数据进行:逆序添加、逆序删除等破坏顺序操作:

    会产生没有必要的真实DOM更新 ==> 界面效果没问题, 但效率低

    2. 如果结构中还包含输入类的DOM:

    会产生错误DOM更新 ==> 界面有问题。

    4. 开发中如何选择key?:

    1.最好使用每条数据的唯一标识作为key, 比如id、手机号、身份证号、学号等唯一值。

    2.如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表用于展示,

    使用index作为key是没有问题的。

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>key的原理</title>
    6. <script type="text/javascript" src="../js/vue.js"></script>
    7. </head>
    8. <body>
    9. <!-- 准备好一个容器-->
    10. <div id="root">
    11. <!-- 遍历数组 -->
    12. <h2>人员列表(遍历数组)</h2>
    13. <button @click.once="add">添加一个老刘</button>
    14. <ul>
    15. <li v-for="(p,index) of persons" :key="index">
    16. {{p.name}}-{{p.age}}
    17. <input type="text">
    18. </li>
    19. </ul>
    20. </div>
    21. <script type="text/javascript">
    22. Vue.config.productionTip = false
    23. new Vue({
    24. el:'#root',
    25. data:{
    26. persons:[
    27. {id:'001',name:'张三',age:18},
    28. {id:'002',name:'李四',age:19},
    29. {id:'003',name:'王五',age:20}
    30. ]
    31. },
    32. methods: {
    33. add(){
    34. const p = {id:'004',name:'老刘',age:40}
    35. this.persons.unshift(p)
    36. }
    37. },
    38. })
    39. </script>
    40. </html>

    列表过滤

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>列表过滤</title>
    6. <script type="text/javascript" src="../js/vue.js"></script>
    7. </head>
    8. <body>
    9. <!-- 准备好一个容器-->
    10. <div id="root">
    11. <h2>人员列表</h2>
    12. <input type="text" placeholder="请输入名字" v-model="keyWord">
    13. <ul>
    14. <li v-for="(p,index) of filPerons" :key="index">
    15. {{p.name}}-{{p.age}}-{{p.sex}}
    16. </li>
    17. </ul>
    18. </div>
    19. <script type="text/javascript">
    20. Vue.config.productionTip = false
    21. //用watch实现
    22. //#region
    23. /* new Vue({
    24. el:'#root',
    25. data:{
    26. keyWord:'',
    27. persons:[
    28. {id:'001',name:'马冬梅',age:19,sex:'女'},
    29. {id:'002',name:'周冬雨',age:20,sex:'女'},
    30. {id:'003',name:'周杰伦',age:21,sex:'男'},
    31. {id:'004',name:'温兆伦',age:22,sex:'男'}
    32. ],
    33. filPerons:[]
    34. },
    35. watch:{
    36. keyWord:{
    37. immediate:true,
    38. handler(val){
    39. this.filPerons = this.persons.filter((p)=>{
    40. return p.name.indexOf(val) !== -1
    41. })
    42. }
    43. }
    44. }
    45. }) */
    46. //#endregion
    47. //用computed实现
    48. new Vue({
    49. el:'#root',
    50. data:{
    51. keyWord:'',
    52. persons:[
    53. {id:'001',name:'马冬梅',age:19,sex:'女'},
    54. {id:'002',name:'周冬雨',age:20,sex:'女'},
    55. {id:'003',name:'周杰伦',age:21,sex:'男'},
    56. {id:'004',name:'温兆伦',age:22,sex:'男'}
    57. ]
    58. },
    59. computed:{
    60. filPerons(){
    61. return this.persons.filter((p)=>{
    62. return p.name.indexOf(this.keyWord) !== -1
    63. })
    64. }
    65. }
    66. })
    67. </script>
    68. </html>

    列表排序 

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>列表排序</title>
    6. <script type="text/javascript" src="../js/vue.js"></script>
    7. </head>
    8. <body>
    9. <!-- 准备好一个容器-->
    10. <div id="root">
    11. <h2>人员列表</h2>
    12. <input type="text" placeholder="请输入名字" v-model="keyWord">
    13. <button @click="sortType = 2">年龄升序</button>
    14. <button @click="sortType = 1">年龄降序</button>
    15. <button @click="sortType = 0">原顺序</button>
    16. <ul>
    17. <li v-for="(p,index) of filPerons" :key="p.id">
    18. {{p.name}}-{{p.age}}-{{p.sex}}
    19. <input type="text">
    20. </li>
    21. </ul>
    22. </div>
    23. <script type="text/javascript">
    24. Vue.config.productionTip = false
    25. new Vue({
    26. el:'#root',
    27. data:{
    28. keyWord:'',
    29. sortType:0, //0原顺序 1降序 2升序
    30. persons:[
    31. {id:'001',name:'马冬梅',age:30,sex:'女'},
    32. {id:'002',name:'周冬雨',age:31,sex:'女'},
    33. {id:'003',name:'周杰伦',age:18,sex:'男'},
    34. {id:'004',name:'温兆伦',age:19,sex:'男'}
    35. ]
    36. },
    37. computed:{
    38. filPerons(){
    39. const arr = this.persons.filter((p)=>{
    40. return p.name.indexOf(this.keyWord) !== -1
    41. })
    42. //判断一下是否需要排序
    43. if(this.sortType){
    44. arr.sort((p1,p2)=>{
    45. return this.sortType === 1 ? p2.age-p1.age : p1.age-p2.age
    46. })
    47. }
    48. return arr
    49. }
    50. }
    51. })
    52. </script>
    53. </html>
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>更新时的一个问题</title>
    6. <script type="text/javascript" src="../js/vue.js"></script>
    7. </head>
    8. <body>
    9. <!-- 准备好一个容器-->
    10. <div id="root">
    11. <h2>人员列表</h2>
    12. <button @click="updateMei">更新马冬梅的信息</button>
    13. <ul>
    14. <li v-for="(p,index) of persons" :key="p.id">
    15. {{p.name}}-{{p.age}}-{{p.sex}}
    16. </li>
    17. </ul>
    18. </div>
    19. <script type="text/javascript">
    20. Vue.config.productionTip = false
    21. const vm = new Vue({
    22. el:'#root',
    23. data:{
    24. persons:[
    25. {id:'001',name:'马冬梅',age:30,sex:'女'},
    26. {id:'002',name:'周冬雨',age:31,sex:'女'},
    27. {id:'003',name:'周杰伦',age:18,sex:'男'},
    28. {id:'004',name:'温兆伦',age:19,sex:'男'}
    29. ]
    30. },
    31. methods: {
    32. updateMei(){
    33. // this.persons[0].name = '马老师' //奏效
    34. // this.persons[0].age = 50 //奏效
    35. // this.persons[0].sex = '男' //奏效
    36. // this.persons[0] = {id:'001',name:'马老师',age:50,sex:'男'} //不奏效
    37. this.persons.splice(0,1,{id:'001',name:'马老师',age:50,sex:'男'})
    38. }
    39. }
    40. })
    41. </script>
    42. </html>

    Vue监测数据改变的原理_对象

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>Vue监测数据改变的原理</title>
    6. <!-- 引入Vue -->
    7. <script type="text/javascript" src="../js/vue.js"></script>
    8. </head>
    9. <body>
    10. <!-- 准备好一个容器-->
    11. <div id="root">
    12. <h2>学校名称:{{name}}</h2>
    13. <h2>学校地址:{{address}}</h2>
    14. </div>
    15. </body>
    16. <script type="text/javascript">
    17. Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    18. const vm = new Vue({
    19. el:'#root',
    20. data:{
    21. name:'zt',
    22. address:'cs',
    23. student:{
    24. name:'tom',
    25. age:{
    26. rAge:40,
    27. sAge:29,
    28. },
    29. friends:[
    30. {name:'jerry',age:35}
    31. ]
    32. }
    33. }
    34. })
    35. </script>
    36. </html>

    模拟一个数据监测

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>Document</title>
    6. </head>
    7. <body>
    8. <script type="text/javascript" >
    9. let data = {
    10. name:'尚硅谷',
    11. address:'北京',
    12. }
    13. //创建一个监视的实例对象,用于监视data中属性的变化
    14. const obs = new Observer(data)
    15. console.log(obs)
    16. //准备一个vm实例对象
    17. let vm = {}
    18. vm._data = data = obs
    19. function Observer(obj){
    20. //汇总对象中所有的属性形成一个数组
    21. const keys = Object.keys(obj)
    22. //遍历
    23. keys.forEach((k)=>{
    24. Object.defineProperty(this,k,{
    25. get(){
    26. return obj[k]
    27. },
    28. set(val){
    29. console.log(`${k}被改了,我要去解析模板,生成虚拟DOM.....我要开始忙了`)
    30. obj[k] = val
    31. }
    32. })
    33. })
    34. }
    35. </script>
    36. </body>
    37. </html>

    Vue.set的使用 Vue监测数据改变的原理

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>Vue监测数据改变的原理</title>
    6. <!-- 引入Vue -->
    7. <script type="text/javascript" src="../js/vue.js"></script>
    8. </head>
    9. <body>
    10. <!-- 准备好一个容器-->
    11. <div id="root">
    12. <h1>学校信息</h1>
    13. <h2>学校名称:{{school.name}}</h2>
    14. <h2>学校地址:{{school.address}}</h2>
    15. <h2>校长是:{{school.leader}}</h2>
    16. <hr/>
    17. <h1>学生信息</h1>
    18. <button @click="addSex">添加一个性别属性,默认值是男</button>
    19. <h2>姓名:{{student.name}}</h2>
    20. <h2 v-if="student.sex">性别:{{student.sex}}</h2>
    21. <h2>年龄:真实{{student.age.rAge}},对外{{student.age.sAge}}</h2>
    22. <h2>朋友们</h2>
    23. <ul>
    24. <li v-for="(f,index) in student.friends" :key="index">
    25. {{f.name}}--{{f.age}}
    26. </li>
    27. </ul>
    28. </div>
    29. </body>
    30. <script type="text/javascript">
    31. Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    32. const vm = new Vue({
    33. el:'#root',
    34. data:{
    35. school:{
    36. name:'zt',
    37. address:'cs',
    38. },
    39. student:{
    40. name:'tom',
    41. age:{
    42. rAge:40,
    43. sAge:29,
    44. },
    45. friends:[
    46. {name:'jerry',age:35},
    47. {name:'tony',age:36}
    48. ]
    49. }
    50. },
    51. methods: {
    52. addSex(){
    53. // Vue.set(this.student,'sex','男')
    54. this.$set(this.student,'sex','男')
    55. }
    56. }
    57. })
    58. </script>
    59. </html>

    Vue监测数据改变的原理_数组

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>Vue监测数据改变的原理_数组</title>
    6. <!-- 引入Vue -->
    7. <script type="text/javascript" src="../js/vue.js"></script>
    8. </head>
    9. <body>
    10. <!-- 准备好一个容器-->
    11. <div id="root">
    12. <h1>学校信息</h1>
    13. <h2>学校名称:{{school.name}}</h2>
    14. <h2>学校地址:{{school.address}}</h2>
    15. <h2>校长是:{{school.leader}}</h2>
    16. <hr/>
    17. <h1>学生信息</h1>
    18. <button @click="addSex">添加一个性别属性,默认值是男</button>
    19. <h2>姓名:{{student.name}}</h2>
    20. <h2 v-if="student.sex">性别:{{student.sex}}</h2>
    21. <h2>年龄:真实{{student.age.rAge}},对外{{student.age.sAge}}</h2>
    22. <h2>爱好</h2>
    23. <ul>
    24. <li v-for="(h,index) in student.hobby" :key="index">
    25. {{h}}
    26. </li>
    27. </ul>
    28. <h2>朋友们</h2>
    29. <ul>
    30. <li v-for="(f,index) in student.friends" :key="index">
    31. {{f.name}}--{{f.age}}
    32. </li>
    33. </ul>
    34. </div>
    35. </body>
    36. <script type="text/javascript">
    37. Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    38. const vm = new Vue({
    39. el:'#root',
    40. data:{
    41. school:{
    42. name:'尚硅谷',
    43. address:'北京',
    44. },
    45. student:{
    46. name:'tom',
    47. age:{
    48. rAge:40,
    49. sAge:29,
    50. },
    51. hobby:['抽烟','喝酒','烫头'],
    52. friends:[
    53. {name:'jerry',age:35},
    54. {name:'tony',age:36}
    55. ]
    56. }
    57. },
    58. methods: {
    59. addSex(){
    60. // Vue.set(this.student,'sex','男')
    61. this.$set(this.student,'sex','男')
    62. }
    63. }
    64. })
    65. </script>
    66. </html>

    Vue监视数据的原理:
    1. vue会监视data中所有层次的数据。

    2. 如何监测对象中的数据?
        通过setter实现监视,且要在new Vue时就传入要监测的数据。
        (1).对象中后追加的属性,Vue默认不做响应式处理
        (2).如需给后添加的属性做响应式,请使用如下API:
         Vue.set(target,propertyName/index,value) 或 
         vm.$set(target,propertyName/index,value)

    3. 如何监测数组中的数据?
      通过包裹数组更新元素的方法实现,本质就是做了两件事:
       (1).调用原生对应的方法对数组进行更新。
        (2).重新解析模板,进而更新页面。

     4.在Vue修改数组中的某个元素一定要用如下方法:
    1.使用这些API:push()、pop()、shift()、unshift()、splice()、sort()、reverse()
      2.Vue.set() 或 vm.$set()
     特别注意:Vue.set() 和 vm.$set() 不能给vm 或 vm的根数据对象 添加属性!!!

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>总结数据监视</title>
    6. <style>
    7. button{
    8. margin-top: 10px;
    9. }
    10. </style>
    11. <!-- 引入Vue -->
    12. <script type="text/javascript" src="../js/vue.js"></script>
    13. </head>
    14. <body>
    15. <!-- 准备好一个容器-->
    16. <div id="root">
    17. <h1>学生信息</h1>
    18. <button @click="student.age++">年龄+1岁</button> <br/>
    19. <button @click="addSex">添加性别属性,默认值:男</button> <br/>
    20. <button @click="student.sex = '未知' ">修改性别</button> <br/>
    21. <button @click="addFriend">在列表首位添加一个朋友</button> <br/>
    22. <button @click="updateFirstFriendName">修改第一个朋友的名字为:张三</button> <br/>
    23. <button @click="addHobby">添加一个爱好</button> <br/>
    24. <button @click="updateHobby">修改第一个爱好为:开车</button> <br/>
    25. <button @click="removeSmoke">过滤掉爱好中的抽烟</button> <br/>
    26. <h3>姓名:{{student.name}}</h3>
    27. <h3>年龄:{{student.age}}</h3>
    28. <h3 v-if="student.sex">性别:{{student.sex}}</h3>
    29. <h3>爱好:</h3>
    30. <ul>
    31. <li v-for="(h,index) in student.hobby" :key="index">
    32. {{h}}
    33. </li>
    34. </ul>
    35. <h3>朋友们:</h3>
    36. <ul>
    37. <li v-for="(f,index) in student.friends" :key="index">
    38. {{f.name}}--{{f.age}}
    39. </li>
    40. </ul>
    41. </div>
    42. </body>
    43. <script type="text/javascript">
    44. Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
    45. const vm = new Vue({
    46. el:'#root',
    47. data:{
    48. student:{
    49. name:'tom',
    50. age:18,
    51. hobby:['抽烟','喝酒','烫头'],
    52. friends:[
    53. {name:'jerry',age:35},
    54. {name:'tony',age:36}
    55. ]
    56. }
    57. },
    58. methods: {
    59. addSex(){
    60. // Vue.set(this.student,'sex','男')
    61. this.$set(this.student,'sex','男')
    62. },
    63. addFriend(){
    64. this.student.friends.unshift({name:'jack',age:70})
    65. },
    66. updateFirstFriendName(){
    67. this.student.friends[0].name = '张三'
    68. },
    69. addHobby(){
    70. this.student.hobby.push('学习')
    71. },
    72. updateHobby(){
    73. // this.student.hobby.splice(0,1,'开车')
    74. // Vue.set(this.student.hobby,0,'开车')
    75. this.$set(this.student.hobby,0,'开车')
    76. },
    77. removeSmoke(){
    78. this.student.hobby = this.student.hobby.filter((h)=>{
    79. return h !== '抽烟'
    80. })
    81. }
    82. }
    83. })
    84. </script>
    85. </html>

  • 相关阅读:
    (附源码)springboot在线仓库 毕业设计745131
    HCNP Routing&Switching之MSTP
    Unity中Shader立方体纹理Cubemap
    《AI一键生成抖音商品种草文案》让你秒变带货王!
    Oracle ADG状态查看与相关视图
    科研小白的成长之路——博一年度总结
    ELF文件结构
    科普rabbitmq,rocketmq,kafka三者的架构比较
    提升程序运行速度-计算加速的20种方法
    sklearn学习笔记之线性回归
  • 原文地址:https://blog.csdn.net/weixin_40746230/article/details/125407343