vue重新起航(三)

class与style绑定

用v-bind来绑定class和style

对象语法

1.class active是否存在取决于vue实例中的isActive变量,true则存在,false则无

<div id="app" v-bind:class={active:isActive}></div>

2.可与普通类名共存

 <div id="app" class='new' v-bind:class={active:isActive}></div>

3.绑定数据对象不一定要内联在模板里

 <div id="app" :class="classObject"></div>

data: {
        classObject: {
          isActive: true,
          textDanger:true
        }
      }

4.可以绑定一个返回对象的计算属性

<div id="app" :class="classObject"></div>

computed: {
        classObject: function () {
          return {
            active: this.isActive && !this.error,
            'text-danger': this.error && this.error.type === 'fatal'
          }
        }
      }

5.数组语法,v-bind+一个数组,数组里也可以使用对象语法

<div id="app" :class="[activeClass,errorClass]"></div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        activeClass: 'active',
        errorClass:'text-danger'
      },
    })
  </script>

三元表达式用于切换

<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>

绑定类名的语法同样可以用在组件上

<my-component v-bind:class="{ active: isActive }"></my-component>

绑定内联样式

1.对象语法,将样式的值放到data里

<div id="app" :style="{color:activeColor,fontSize:fontSize+'px'}"></div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        activeColor:'red',
        fontSize:20
      },
    })
  </script>

当然也可以直接绑定一个对象

<div id="app" :style="activeCss"></div>
  <script>
    var vm = new Vue({
      el: '#app',
      data: {
        activeCss: {
          color: 'red',
          fontSize: '20px'
        }
      },
    })

2.也可以使用数组语法

 <div id="app" :style="[activeClass]"></div>

条件渲染

v-if

<h1 v-if="ok">Yes</h1>
<h1 v-else>No</h1>

ok=true => Yes ok=false => No

在<template>元素上使用v-if条件渲染分组,渲染结果不包括template

<template v-if="ok">
  <h1>Title</h1>
  <p>Paragraph 1</p>
  <p>Paragraph 2</p>
</template>

v-else 紧跟v-if或v-else-if

v-else-if


用key管理可复用的元素

vue会尽可能高效的渲染元素呢,通常会复用已有元素而不是重新渲染元素

 <template v-if="loginType === 'username'">
      <label>Username</label>
      <input placeholder="Enter your username">
    </template>
    <template v-else>
      <label>Email</label>
      <input placeholder="Enter your email address" >
    </template>

发现切换template后,input不会被替换


复用组件.gif

但是给每个组件添加一个key加以区分,就可以替换了


key管理复用组件.gif

v-show

<h1 v-show="ok">Hello!</h1>

使用v-show的元素会始终被渲染并保留在DOM中,v-show只是简单地切换元素的CSS属性display
v-show不支持template,也不支持v-else


v-if和v-show的区别

v-if,是惰性的,是真正的‘条件渲染’,只要条件为假,则什么也不做,知道条件为真时才开始渲染
v-show不管初始条件是什么,元素始终会被渲染,单纯的切换css

v-if有更高的切换开销,v-show有更高的初始渲染开销,频繁切换用v-show,运行条件很少改变,用v-if

tip v-for 和v-if一起使用时,v-for比v-if具有更高的优先级


列表渲染 v-for

用v-for来进行条件渲染

item in items 形式的特殊语法,items 是源数据数组并且 item 是数组元素迭代的别名。
也接受index这个参数用来表示下标
也可以使用item of items

 <div id="app">
    <li v-for='(item,index) in items'>
      {{index}}-{{item.text}}
    </li>
  </div>

  var vm = new Vue({
      el:'#app',
      data:{
        items: [
          {text:'你好'},
          {text:'中国'}
        ]
      }
    })
image.png

v-for 遍历对象 index 索引 key键名 item

<div id="app">
    <li v-for='(value,key,index) in object'>
      {{index}}-{{key}}-{{value}}
    </li>
  </div>

var vm = new Vue({
      el: '#app',
      data: {
        object: {
          firstName: 'John',
          lastName: 'Doe',
          age: 30
        }
      }
    })

v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。所以用v-for时要提供一个key,key值是每项都有的唯一id

<div v-for="item in items" :key="item.id">
  <!-- 内容 -->
</div>

变异方法

push()
pop()
shift()
unshift()
splice()
sort()
reverse()
一组观察数组的变异方法,所以它们也将会触发视图更新


image.png

数组发生变化,页面会检测到,重新渲染

替换数组

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

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

vue不会丢弃掉所有dom重新渲染,会智能重用,因此用含有相同元素去替换原来数组会很高效


image.png

注意

vue不能检测以下数组的变动

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


image.png

解决办法:
// Vue.set
Vue.set(vm.items, indexOfItem, newValue)


image.png

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


image.png

解决办法
vm.items.splice(indexOfItem, 1, newValue)


image.png

vue不能检测到对象属性的添加和删除

image.png

解决方法:Vue.set(vm.userProfile, 'age', 27)
或者vm.set(vm.userProfile,'weight','90kg')set 只是 Vue.set的别名

image.png

使用 Object.assign() 或 _.extend()添加多条属性

Object.assign(vm.userProfile, {
  age: 27,
  favoriteColor: 'Vue Green'
})
这种添加多条属性的方式并不是响应式的
image.png
响应式的应该写成这样
vm.userProfile=Object.assign({},vm.userProfile, {
  age: 27,
  favoriteColor: 'Vue Green'
})
image.png

显示过滤/排序结果

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

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

 computed:{
        evenNumbers: function(){
          return this.numbers.filter(function(n){
            return n%2 === 0
          })
        }
      }

当计算属性不适合时,我们可以使用方法methods

<li v-for="n in odd(numbers)">{{n}}</li>
 methods:{
        odd: function(numbers){
          return numbers.filter(function(item){
            return item%2 === 1
          })
        }
      }

v-for 也可以取整数

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

v-for 也可以用在template上

v-for和v-if同时使用 可以先判断后循环 也可以先循环后判断




组件的v-for 使用---简单的例子todoList

  <div id="todo-list-demo">
    <form v-on:submit.prevent='addNewTodo'>
    阻止表单触发默认事件刷新转而调用addNewTodo
      <input id='new-todo' 
             placeholder="E.g. Feed the cat"
             v-model="newTodoText">
      实现数据双向绑定,输入什么,就在下方添加什么
      <button>Add</button>
    </form>

    <ul>
      <li is='todo-item'  组件用is来表明身份,相当于<todo-item><todo-item>
          v-for="(todo,index) in todos"
          循环遍历
          v-bind:key="todo.id"
          接收父组件传值
          v-bind:title="todo.title"
          v-on:remove="todos.splice(index,1)"
          监听到了触发remove函数就执行remove函数
      >
      </li>

    </ul>
  </div>

  <script>

    Vue.component('todo-item',{
      template:`<li>{{title}}
        <button v-on:click="$emit('remove')">
        子组件监听click事件,如果click了就触发remove函数
          remove
        </button>
        </li>`,
      props:['title']
    })
    
    new Vue({
      el: '#todo-list-demo',
      data: {
        newTodoText: '',
        todos: [{
            id: 1,
            title: 'Do the dishes',
          },
          {
            id: 2,
            title: 'Take out the trash',
          },
          {
            id: 3,
            title: 'Mow the lawn'
          }
        ],
        nextTodoId: 4
      },
      methods:{
        addNewTodo:function(){
          this.todos.push({
            id:this.nextTodoId++,
            title:this.newTodoText
          })
          添加新的数据,赋予id,同时再利用双向绑定清空input框
          this.newTodoText=''
        }
      }
    })
  </script>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容

  • 特别喜欢画中静坐者的状态,跟我上班的样纸很像……
    画画的杜杜阅读 519评论 4 4
  • 一、问答作业 1、HTML:超文本标记语言XHTML:在原有的HTML上进行了小小的扩展 变得更 加严谨HTML5...
    咖啡和烟阅读 280评论 2 1
  • 那一年,骄阳似火;那一年,我收获很多。 那一年,给我留下了深刻的印象,也是在那一年,我突然长大了许多。 那是我小学...
    终身学习的老道阅读 224评论 0 1