Vue的一些高级特性

2021-11-14  本文已影响0人  JX灬君

Vue的一些高级特性

兄弟组件传值

vue如何自己实现v-model

// app.vue
<div>{{ names }}</div>
<TestModel v-model="names" />
// TestModel.vue
<input
  type="text"
  :value="text"
  @input="$emit('change', $event.target.value)"
  name=""
  id=""
/>
export default {
  model: {
    prop: 'name1', // 对应props text
    event: 'change'
  },
  props: {
    name1: String,
    default () {
      return ''
    }
  }
}

Vue组件更新之后如何获取最新DOM- $nextTick

// 3个子元素添加子元素之后打印 = 3个
addItem () {
      this.list.push(Date.now())
      this.list.push(Date.now())
      this.list.push(Date.now())
      // 获取DOM元素
      const ulElem = this.$refs.ul1
      // eslint-disable-next-line
      console.log(ulElem.childNodes)
      // eslint-disable-next-line
      console.log(ulElem.childNodes.length)
    }
// 3个子元素添加子元素之后打印 = 6ge
addItem () {
      this.list.push(Date.now())
      this.list.push(Date.now())
      this.list.push(Date.now())
      this.$nextTick(() => {
        // 获取DOM元素
        const ulElem = this.$refs.ul1
        // eslint-disable-next-line
        console.log(ulElem.childNodes)
        // eslint-disable-next-line
        console.log(ulElem.childNodes.length)
      })

    }

Vue通过ref获取DOM元素的技巧

<ul ref="ul1">
// 获取DOM元素
const ulElem = this.$refs.ul1

slot插槽

动态组件

import TplDemo from './TplDemo'
components: {
  TplDemo
}
data () {
  return {
    TplDemoName: TplDemo
  }
},
<component :is="TplDemoName"></component>
import Text from './Text'
import Image from './Image'
components: {
  Text, Image
}
data () {
  return {
    newsData:{
      1:{
        type: 'text'
      },
      2:{
        type: 'text'
      },
      3:{
        type: 'image'
      }
    }
  }
},
<div v-for="(name,index) in newsData" :key="index">
  <component :is="name:type"></component>
</div>

异步组件

// 同步加载组件
import Text from './Text'
components: {
    Text
  }
// 异步加载组件
components: {
    Text: () => import('../Text')
  }
// 相当于
components: {
    Text: () =>{
      return import('../Text')
    } 
  }

keep-alive 组件缓存

Vue组件抽离公共逻辑 mixin

// same.js相同组件
export default {
    data() {
        return {
            name: 'mixin混入'
        }
    },
    methods: {
        showName() {
            // eslint-disable-next-line
            console.log(this.name)
        }
    },
    mounted() {
        // eslint-disable-next-line
        console.log('mixin mounted', this.name)
    }
}
// vue页面使用
import Same from './same.js'
export default {
  mixins: [Same],
  name: 'app',
  data () {
    return {
      names: 'zach'
    }
  }
}
// 然后直接使用即可
上一篇 下一篇

猜你喜欢

热点阅读