VUE(五)

来源:互联网 发布:刘易斯汉密尔顿 知乎 编辑:程序博客网 时间:2024/06/08 02:57

点击下载word文档

VUE学习(五)

  1. 列表渲染 for

    1. 迭代一个数组

        <!--迭代一个数组-->

        <!--test1v-for指令需要使用 item in items形式的特殊语法,items是源数据数组并且 item是数组元素迭代的别名。-->

        <!--我要把items中的东西取出来 item就是每次取出来的对象-->

        <ul id="example-1">

         <li v-for="item in items">

         {{ item.message }}

         </li>

        </ul>

        <script>

            var example1 = new Vue({

             el: '#example-1',

             data: {

             items: [

             { message: 'Foo' },

             { message: 'Bar' }

             ]

             }

            })

        </script>        

        运行结果:

 

 

        <!--test1.1 v-for块中,我们拥有对父作用域属性的完全访问权限。v-for还支持一个可选的第二个参数为当前项的索引。-->

        <!--扩展:你也可以用 of替代 in作为分隔符,因为它是最接近 JavaScript迭代器的语法:-->

        <ul id="example-2">

         <li v-for="(item, index) in items">

         {{ parentMessage }} - {{ index }} - {{ item.message }}

         </li>

        </ul>

        <script>

            var example2 = new Vue({

             el: '#example-2',

             data: {

             parentMessage: 'Parent',

             items: [

             { message: 'Foo' },

             { message: 'Bar' }

             ]

             }

            })

        </script>

        运行结果:

 

  1. 迭代一个对象

        <!--迭代一个对象-->

        <!--test2-->

        <ul id="v-for-object" class="demo">

         <li v-for="value in object">

         {{ value }}

         </li>

        </ul>

        <script>

            new Vue({

             el: '#v-for-object',

             data: {

             object: {

             firstName: 'John',

             lastName: 'Doe',

             age: 30

             }

             }

            })

        </script>

        运行结果:

 

 

        <!--test2.1你也可以提供第二个的参数为键名:第三个参数为索引:-->

        <div id="app-3">

            <div v-for="(value, key, index) in object" >

             {{ index }}. {{ key }}: {{ value }}

            </div>

        </div>

        <script>

            new Vue({

             el: '#app-3',

             data: {

             object: {

             firstName: 'John',

             lastName: 'Doe',

             age: 30

             }

             }

            })

        </script>

        运行结果:

  1. 数据源更新检测 ,实现动态的数据展示

为了实现动态的页面变换,我们提供了对数据的动态观察 。

  1. 数组更新检测

    1. 变异方法

      (可以理解为就是vue提供的)

对于数组更新的检测,Vue 提供了一组观察数组的变异方法,所以它们被调用的时候也将会触发视图更新。这些方法如下:

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()

 

具体用法可以看官网的api。

  1. 变异方法

相比变异方法,也有非变异方法,例如:filter(), concat() 和 slice() 。这些不会改变原始数组,但总是返回一个新数组。当使用非变异方法时,可以用新数组替换旧数组:

example1.items = example1.items.filter(function (item) {return item.message.match(/Foo/)})

  1. Vue不能检测的数组变动

    由于 JavaScript 的限制,Vue 不能检测以下变动的数组:

    当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue

            当你修改数组的长度时,例如:vm.items.length = newLength

        <script>

        //为了解决第一类问题,以下两种方式都可以实现和 vm.items[indexOfItem] = newValue相同的效果,同时也将触发状态更新:-->

            //第一种 Vue.set

            Vue.set(example1.items, indexOfItem, newValue)

            //第二种 Array.prototype.splice

            example1.items.splice(indexOfItem, 1, newValue)

        //为了解决第二类问题,你可以使用 splice

            example1.items.splice(newLength)

        </script>        

  1. 对象更新检测

对于对象的检测,vue实例建立后,Vue不能检测对象属性的添加或删除:例如给data对象加一个属性;

var vm = new Vue({

  data: {    a: 1  }})// `vm.a` 现在是可以获取的vm.b = 2// `vm.b` 是不好使

Vue不能动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, key, value) 方法向嵌套对象添加响应式属性。例如向data中的对象添加属性

        var vm = new Vue({

         data: {

         userProfile: {

         name: 'Anika'

         }

         }

        })

        Vue.set(vm.userProfile, 'age', 27)

 

        

  1. 循环后显示过滤或排序的视图

有时,我们想要显示一个数组的过滤或排序副本,而不实际改变或重置原始数据。在这种情况下,可以创建返回过滤或排序数组的计算属性。

v-for的数据源也可以取整数,将多次循环

 

        <div id="app-7">

            <li v-for="n in evenNumbers">{{ n }}</li>

        </div>

        <script>

            var vm =new Vue({

                el:'#app-7',

                data: {

                  numbers: [ 1, 2, 3, 4, 5 ]

                },

            <!--在计算属性不适用的情况下 (例如,在嵌套 v-for 循环中) 你可以使用一个 method 方法:-->

        <div id="app-8">

            <li v-for="n in even(numbers)">{{ n }}</li>

            <!--v-for 也可以取整数。在这种情况下,它将重复多次模板。-->

            <div>

              <span v-for="n in 10">{{ n }} </span>

            </div>

        </div>

        <script>

            var vm =new Vue({

                el:'#app-8',

                data: {

                  numbers: [ 1, 2, 3, 4, 5 ]

                },

                methods: {

                  even: function (numbers) {

                    return numbers.filter(function (number) {

                      return number % 2 === 0

                    })

                  }

                }

            })

        </script>

        运行结果:

 

类似于 v-if,你也可以利用带有 v-for 的 <template> 渲染多个元素。比如:

        <div id="app-10">

            <ul>

             <template v-for="item in items">

             <li>{{ item.message }}</li>

             <li class="divider">我是还是我</li>

             </template>

            </ul>

        </div>

        <script>

            var vm =new Vue({

                el:'#app-10',

                data: {

                     items: [

                 { message: 'Foo' },

                 { message: 'Bar' }

                 ]

                 },

                methods: {

                 even: function (numbers) {

                 return numbers.filter(function (number) {

                 return number % 2 === 0

                 })

                 }

                }

            })

        </script>

        运行结果:

        

  1. v-for with v-if

        <!--v-for with v-if-->

        <!--v-for的优先级比 v-if更高,这意味着 v-if将分别重复运行于每个 v-for循环中。当你想为仅有的一些项渲染节点时,

                这种优先级的机制会十分有用,如下:-->

        <div id="app-11">

            <li v-for="todo in todos" v-if="!todo.isComplete">

             {{ todo }}

            </li>

        </div>

        <script>

            var vm =new Vue({

                el:'#app-11',

                data: {

                     todos: [

                 { isComplete: true },

                 { message: 'Bar' }

                 ]

                 }

            })

        </script>

        <!--而如果你的目的是有条件地跳过循环的执行,那么可以将 v-if置于外层元素 ( <template>)上。-->

        

原创粉丝点击