Vue-组件进阶

272 阅读2分钟

refs的使用

<body>
  <div id="app">
    <App></App>
  </div>
  <script src="../vue.js"></script>
  <script>
  
    Vue.component('Test',{
      data() {return {}},
    })

    const App ={
      data() {return {}},
      mounted() {
        //1.如果给标签添加ref,获取的就是真实的DOM节点
        console.log(this.$refs.btn);
        //加载页面 自动让输入框获取焦点
        this.$refs.input.focus();
        //2.如果给子组件添加ref,获取的是当前子组件对象
        console.log(this.$refs.test);
      },
      template:`
        <div>
          <Test ref='test'></Test>  
          <input type="text" ref='input'/>
          <button ref='btn'>改变生死</button>
        </div>
      `
    }

    new Vue({
      el:'#app',
      data:{},
      components:{
        App
      }
    })
  </script>
</body>

nextTick

  <div id="app">
    <h3>{{msg}}</h3>
  </div>
  <script src="../vue.js"></script>
  <script>
    const vm = new Vue({
      el:'#app',
      data:{
        msg:'qaq'
      }
    })
    vm.msg='new msg';
    console.log(vm.$el.textContent);//qaq
    //为了数据变化之后等待vue完成更新DOM,可以在数据变化之后立即使用Vue.nextTick
    //在当前的回调函数中能获取最新的DOM
    Vue.nextTick(()=>{
      console.log(vm.$el.textContent);//new msg
    })
  </script>

对象变更检测

两种方法

  1. this.$set(Object,key,value)
  2. Object.assign()
<body>
  <div id="app">
    <h3>
      {{user.name}},{{user.age}},{{user.sex}}
      <button @click = 'handlerAdd'>添加属性</button>
    </h3>
  </div>
  <script src="../vue.js"></script>
  <script>
    //Vue不能检测对象属性的添加和删除
    new Vue({
      el:'#app',
      data:{
        user:{}
      },
      methods: {
        handlerAdd(){
          //Vue.set(object,key,value)添加响应式属性
          // this.user.age=20;//无变化
          //1.this.$set
          // this.$set(this.user,'age',20);
          //2.Object.assign()
          this.user = Object.assign({},this.user,{
            age:20,
            sex:'man'
          })
        }
      },
      created() {
        setTimeout(()=>{
          this.user = {
            name:'张三'
          }
        },1000)
      },
    })
  </script>
</body>

mixin

1. mixmin来分发Vue组件中的可复用功能

2. mixmin里的方法属性都会混合进该组件内部中

3. 如果命名冲突 优先使用原本组件的属性方法

<body>
  <div id="app">
    {{msg}}
  </div>
  <script src="../vue.js"></script>
  <script>

    const myMixin = {
      data() {
        return {
          msg:'123'
        }
      },
      created() {
        this.sayHello();
      },
      methods: {
        sayHello(){
          console.log('hello,mixmin');
        }
      },
    }

    new Vue({
      el:'#app',
      data:{
        title:'qaq'
      },
      mixins:[myMixin]
    })
  </script>
</body>

PS:一般用于两个或多个组件上有相同逻辑,且可以用相同代码写出时。将这部分代码const成对象,将该对象mixins入对应的组件。

全局的mixin要格外小心 每个组件实例创建时 它都会被调用
写法为:Vue.mixin({})

注册全局组件的方式

1.在组件中

export default {
    name:'ShoppingCart' //组件名 注册全局组件时使用
  }

2.在main.js中引入 注册

import ShoppingCart from '@/components/ShoppingCart'
Vue.component(ShoppingCart.name, ShoppingCart)