跨平台

vue.js入门之第二篇(语法)

2018-10-01  本文已影响128人  平安喜乐698
目录
1. 语句

条件语句(v-if 指令 true则插入该元素)

if

<div id="app">
    <div v-if="ok">
      <h1>Hello World</h1>
    </div>
</div>
    
<script>
new Vue({
  el: '#app',
  data: {
    ok: true
  }
})
</script>
if else

<div id="app">
    <div v-if="ok">
      <h1>Hello World</h1>
    </div>
    <div v-else>
      Not sorry
    </div>
</div>
    
<script>
new Vue({
  el: '#app',
  data: {
    ok: true
  }
})
</script>
if elseif else

<div id="app">
    <div v-if="type === 'A'">
      A
    </div>
    <div v-else-if="type === 'B'">
      B
    </div>
    <div v-else-if="type === 'C'">
      C
    </div>
    <div v-else>
      Not A/B/C
    </div>
</div>
    
<script>
new Vue({
  el: '#app',
  data: {
    type : 'D',
  }
})
</script>

循环语句 ( v-for 指令,遍历数组、字典)

v-for 的优先级比 v-if 更高(当它们处于同一节点),这意味着 v-if 将分别重复运行于每个 v-for 循环中。
迭代数组

<div id="app">
  <ol>
    <li v-for="site in sites">
      {{ site.name }}
    </li>
  </ol>
</div>
 
<script>
new Vue({
  el: '#app',
  data: {
    sites: [
      { name: 'Runoob' },
      { name: 'Google' },
      { name: 'Taobao' }
    ]
  }
})
</script>
迭代字典

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

 
<script>
new Vue({
  el: '#app',
  data: {
    object: {
      name: '张三',
      url: 'http://www.baidu.com',
      slogan: '到!'
    }
  }
})
</script>
迭代整数

<div id="app">
  <ul>
    <li v-for="n in 10">
     {{ n }}
    </li>
  </ul>
</div>
key

<div v-for="item in items" :key="item.id">
  <!-- 内容 -->
</div>
2. 计算属性
为什么使用计算属性:

举例:
  <div id="example">
    {{ message.split('').reverse().join('') }}
  </div>
  1、{{}} 在模板中放入太多的逻辑会让模板过重且难以维护。
  2、不方便复用

对于任何复杂逻辑,应当使用计算属性。
为什么不使用methods方法:

  1、方法总会重新执行。
  2、computed只有在发生改变时才会重新取值。

computed默认只有 getter ,可以手动添加setter。

举例:反转字符串

=》原代码逻辑(未使用计算属性)

<div id="app">
  {{ message.split('').reverse().join('') }}
</div>

<script>
new Vue({
  el: '#app',
  data: {
    message: 'Runoob!'
  }
})
</script>




=》使用计算属性

<div id="app">
  <p>原始字符串: {{ message }}</p>
  <p>计算后反转字符串: {{ reversedMessage }}</p>
</div>
 
<script>
var vm = new Vue({
  el: '#app',
  data: {
    message: 'Runoob!'
  },
  computed: {
    // 计算属性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 实例
      return this.message.split('').reverse().join('')
    }
  }
})
</script>

举例:添加setter方法

<div id="app">
  <p>{{ site }}</p>
</div>

<script>
var vm = new Vue({
  el: '#app',
  data: {
    name: 'Google',
    url: 'http://www.google.com'
  },
  computed: {
    site: {
      // getter
      get: function () {
        return this.name + ' ' + this.url
      },
      // setter
      set: function (newValue) {
        var names = newValue.split(' ')
        this.name = names[0]
        this.url = names[names.length - 1]
      }
    }
  }
})
// 调用 setter, vm.name 和 vm.url 也会被对应更新
vm.site = 'helloWorld http://www.runoob.com';
document.write('name: ' + vm.name);
document.write('<br>');
document.write('url: ' + vm.url);
3. 监听属性
使用 见示例

示例1

<div id = "app">
 <p style = "font-size:25px;">计数器: {{ counter }}</p>
 <button @click = "counter++" style = "font-size:25px;">点我</button>
</div>
<script type = "text/javascript">
 var vm = new Vue({
    el: '#app',
    data: {
       counter: 1
    }
 });
 // 监听counter属性
 vm.$watch('counter', function(nval, oval) {
    alert('计数器值的变化 :' + oval + ' 变为 ' + nval + '!');
 });
</script>

示例2(在2个地方都进行了监听)

<div id = "computed_props">
    千米 : <input type = "text" v-model = "kilometers">
    米 : <input type = "text" v-model = "meters">
</div>
<p id="info"></p>
<script type = "text/javascript">
    var vm = new Vue({
    el: '#computed_props',
    data: {
        kilometers : 0,
        meters:0
    },
    methods: {
    },
    computed :{
    },
    watch : {
        kilometers:function(val) {
            this.kilometers = val;
            this.meters = val * 1000;
        },
        meters : function (val) {
            this.kilometers = val/ 1000;
            this.meters = val;
        }
    }
    });
    // $watch 是一个实例方法
    vm.$watch('kilometers', function (newValue, oldValue) {
      // 这个回调将在 vm.kilometers 改变后调用
      document.getElementById ("info").innerHTML = "修改前值为: " + oldValue + ",修改后值为: " + newValue;
    })
</script>

Vue.set、Vue.delete

1、Vue 不允许在已经创建的实例上动态添加新的根级响应式属性。
2、Vue 不能检测到对象属性的添加或删除,最好的方式就是在初始化实例前声明根级响应式属性,哪怕只是一个空值。

添加或删除对象属性
  Vue.set( target, key, value )  
  Vue.delete( target, key )

示例

<div id = "app">
<p style = "font-size:25px;">计数器: {{ products.id }}</p>
<button @click = "products.id++" style = "font-size:25px;">点我</button>
</div>
<script type = "text/javascript">
var myproduct = {"id":1, name:"book", "price":"20.00"};
var vm = new Vue({
   el: '#app',
   data: {
      counter: 1,
      products: myproduct
   }
});
Vue.set(myproduct, 'qty', 1);
Vue.delete(myproduct, 'price');
console.log(vm);
<!--使用 $watch 属性来实现数据的监听,$watch 必须添加在 Vue 实例之外才能实现正确的响应-->
vm.$watch('counter', function(nval, oval) {
   alert('计数器值的变化 :' + oval + ' 变为 ' + nval + '!');
});
</script>
4. {{支持JavaScript 表达式}}
<div id="app">
    {{5+5}}<br>
    {{ ok ? 'YES' : 'NO' }}<br>
    {{ message.split('').reverse().join('') }}
    <div v-bind:id="'list-' + id">Hello</div>
    <p>{{ message }}</p>    数据绑定
</div>
    
<script>
new Vue({
  el: '#app',
  data: {
    ok: true,
    message: 'RUNOOB',
    id : 1
  }
})
</script>
5. 过滤器
方式一:
    <!-- 在两个大括号中 -->
    {{ message | filterA }}
    {{ message | filterA | filterB }}
    {{ message | filterA('arg1', arg2) }}

方式二:
    <!-- 在 v-bind 指令中 -->
    <div v-bind:id="rawId | formatId"></div>

示例(对输入的字符串第一个字母转为大写)

<div id="app">
  {{ message | capitalize }}
</div>
    
<script>
new Vue({
  el: '#app',
  data: {
    message: 'runoob'
  },
  filters: {
    capitalize: function (value) {
      if (!value) return ''
      value = value.toString()
      return value.charAt(0).toUpperCase() + value.slice(1)
    }
  }
})
</script>
6. 计时器
2s后执行
<script>
setTimeout(
    function(){
        vm.counter = 0;
    },2000
);
</script>
7. 混入
1、Vue对象可复用混入对象的所有 方法、计算属性 等。
2、混入对象可以包含任意组件选项。

示例1(局部混入)

var mixin = {
    created: function () {
        document.write('混入调用' + '<br>')
    }
}
new Vue({
    mixins: [mixin],
    created: function () {
        document.write('组件调用' + '<br>')
    }
});

输出:
  混入调用
  组件调用

示例2(局部混入)

var vm = new Vue({
    el: '#databinding',
    data: {
    },
    methods : {
    },
});

// 定义一个混入对象
var myMixin = {
    created: function () {
        this.startmixin()
    },
    methods: {
        startmixin: function () {
            document.write("helloWorld");
        }
    }
};
var Component = Vue.extend({
    mixins: [myMixin]
})
var component = new Component();

示例3(全局混入)

 一旦使用全局混入对象,将会影响到 所有 之后创建的 Vue 实例

// 为自定义的选项 'myOption' 注入一个处理器。
Vue.mixin({
  created: function () {
    var myOption = this.$options.myOption
    if (myOption) {
      console.log(myOption)
    }
  }
})
new Vue({
  myOption: 'hello!'
})
// => "hello!"

示例(和混入中方法名相同时)

var mixin = {
    methods: {
        samemethod: function () {
            document.write('Mixin:相同方法名' + '<br>');
        }
    }
};
var vm = new Vue({
    mixins: [mixin],
    methods: {
        samemethod: function () {
            document.write('Main:相同方法名' + '<br>');
        }
    }
});
vm.samemethod();    // Main:相同方法名



当混入对象和组件含有同名选项时
  对于数据:
    不同者合并
    相同者以组件优先
  方法:
    不同者合并
    相同者
      对于methods 中的方法:组件优先级高,覆盖
      对于methods 外的方法:合并

数组

会改变原数组

  push()    添加元素
  pop()     删除元素
  shift()
  unshift()
  splice()
  sort()
  reverse()

例
vm.items.push({ message: 'Baz' })
不会改变原数组,会返回新书组

  filter() 
  concat() 
  slice()

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

注意

由于 JavaScript 的限制,Vue 不能检测以下变动的数组:
    1、通过索引设置项,例如:vm.items[indexOfItem] = newValue
    2、修改数组长度,例如:vm.items.length = newLength

以下两种方法可解决问题1
  // Vue.set
  // 等价vm.$set(vm.items, indexOfItem, newValue)
  Vue.set(vm.items, indexOfItem, newValue)
  // Array.prototype.splice
  vm.items.splice(indexOfItem, 1, newValue)

以下方法可解决问题2
  vm.items.splice(newLength)
由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除

  var vm = new Vue({
    data: {
      a: 1
    }
  })
  // `vm.a` 现在是响应式的
  vm.b = 2
  // `vm.b` 不是响应式的


对于已经创建的实例,Vue 不能动态添加根级别的响应式属性。
可以使用 Vue.set(object, key, value) 方法向嵌套对象添加响应式属性。
  var vm = new Vue({
    data: {
      userProfile: {
        name: 'Anika'
      }
    }
  })
  // 等价vm.$set(vm.userProfile, 'age', 27)
  Vue.set(vm.userProfile, 'age', 27)

添加多个属性
  vm.userProfile = Object.assign({}, vm.userProfile, {
    age: 27,
    favoriteColor: 'Vue Green'
  })
上一篇 下一篇

猜你喜欢

热点阅读