一、获取Dom

  1. //1.给元素设置ref属性
  2. <p @click="getDom" ref="music">音乐播放</p>
  3. //2.this.$refs.music
  4. export default {
  5. ...
  6. methods: {
  7. getDom(){
  8. console.log(this.$refs.music)
  9. }
  10. }
  11. };

二、获取组件下标

  1. <div class="main-box" >
  2. <div :class="[(index+1)%2==1?'border':'']" v-for="(item,index) in musics" :key="item.id" @click="handleIndex(item.id,index)" :data-index="index" >
  3. <ItemBox :data="item"></ItemBox>
  4. </div>
  1. handleIndex(id,index) {
  2. console.log(index);
  3. }

三、音乐播放

控制Dom

  1. <p @click="getDom" ref="music">音乐播放</p>
  2. getDom(){
  3. console.log(this.$refs.music)
  4. }
  1. <audio @play="onPlay" @pause="onPause" ref="audio" :src="playUrl" controls></audio>
  2. play(){
  3. if(this.isPlay){
  4. this.$refs.audio.pause()
  5. this.isPlay = false
  6. }else{
  7. this.$refs.audio.play()
  8. this.isPlay = true
  9. }
  10. },

@play对应 播放状态
@pause对应 暂停状态

四、event对象

注意在事件中要使用 $ 符号

  1. //html部分
  2. <a href="javascript:void(0);" data-id="12" @click="showEvent($event)">event</a>
  3. //js部分
  4. showEvent(event){
  5. //获取自定义data-id
  6. console.log(event.target.dataset.id)
  7. //阻止事件冒泡
  8. event.stopPropagation();
  9. //阻止默认
  10. event.preventDefault()
  11. }

五、vue中对象更改检测的注意事项

由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除:

  1. var vm = new Vue({
  2. data: {
  3. a: 1
  4. }
  5. })
  6. // `vm.a` 响应式属性
  7. vm.b = 2
  8. // `vm.b` 非响应式属性

5-1 添加属性

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

  1. var vm = new Vue({
  2. data: {
  3. userProfile: {
  4. name: 'Anika'
  5. }
  6. }
  7. })
  8. 你可以添加一个新的 age 属性到嵌套的 userProfile对象:
  9. Vue.set(vm.userProfile, 'age', 27)
  10. 你还可以使用 vm.$set实例方法,它只是全局Vue.set 的别名:
  11. vm.$set(vm.userProfile, 'age', 27)

5-2 添加多个属性

有时你可能需要为已有对象赋予多个新属性,比如使用 Object.assign()_.extend()。在这种情况下,你应该用两个对象的属性创建一个新的对象。所以,如果你想添加新的响应式属性,不要像这样:

  1. Object.assign(vm.userProfile, {
  2. age: 27,
  3. favoriteColor: 'Vue Green'
  4. })

应该这样做:

  1. vm.userProfile = Object.assign({}, vm.userProfile, {
  2. age: 27,
  3. favoriteColor: 'Vue Green'
  4. })

六、数据劫持

  • 当我们访问或设置对象的属性的时候,都会触发相对应的函数,然后在这个函数里返回或设置属性的值。
  • 既然如此,我们当然可以在触发函数的时候动一些手脚做点我们自己想做的事情,这也就是“劫持”操作。
  • 在Vue中其实就是通过Object.defineProperty来劫持对象属性的setter和getter操作,并“种下”一个监听器,当数据发生变化的时候发出通知。

    6-1 Object.defineProperty(obj,prop,descriptor):

    参考文档 参考文档
    vue.js 则是采用Object.defineProperty()来实现数据的劫持的,通过Object.defineProperty()来劫持各个属性的settergetter,在数据变动时立马能侦听到从而调用setter和getter做对应的处理。
    作用: ```javascript Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回 这个对象。

//语法: Object.defineProperty(obj, prop, descriptor)

//参数说明: obj:必需。目标对象 prop:必需。需定义或修改的属性的名字 descriptor:必需。目标属性所拥有的特性

//返回值: 传入函数的对象。即第一个参数obj

  1. <a name="goOUk"></a>
  2. ### 6-2 代理对象
  3. 通过代理对象来访问目标对象,可以实现数据的劫持。<br />在代理的设计模式中,有目标对象、代理对象和事件处理程序,通过代理对象来访问目标对象,可以实现对目标对象的访问权限控制以及数据的劫持工作
  4. ```javascript
  5. //创建一个事件处理器
  6. const handler = {
  7. get: function(obj, prop){
  8. console.log('A value has been accessed');
  9. return obj[prop];
  10. },
  11. set: function(obj, prop, value){
  12. obj[prop] = value;
  13. console.log(`${prop}is being set to${value}`);
  14. }
  15. }
  16. //目标对象
  17. const initialObj = {
  18. id: 1,
  19. name: 'Foo Bar'
  20. }
  21. //代理对象
  22. const proxiedObj = new Proxy(initialObj, handler);
  23. //给代理对象赋值,会调用handler这个事件处理程序,然后调用事件处理程序中的set方法间接访问目标对象,给目标对象赋值
  24. proxiedObj.age = 24