Vue3 其他变更

65 阅读1分钟

v-model

在 Vue2 中 v-mode 指令语法糖简写的代码。

<Son :value="msg" @input="msg=$event" />

在 Vue3 中 v-model 语法糖有所调整。

<Son :modelValue="msg" @update:modelValue="msg=$event" />

<template>
  <h2>count: {{ count }}</h2>
  <hr />
  <Son :modelValue="count" @update:modelValue="count = $event" />
  <!-- <Son v-model="count" /> -->
</template>
<script>
  import { ref } from 'vue'
  import Son from './Son.vue'
  export default {
    name: 'App',
    components: {
      Son
    },
    setup() {
      const count = ref(10)
      return { count }
    }
  }
</script>
<template>
  <h2>子组件 {{ modelValue }}</h2>
  <button @click="$emit('update:modelValue', 100)">改变 count</button>
</template>
<script>
  export default {
    name: 'Son',
    props: {
      modelValue: {
        type: Number,
        default: 0
      }
    }
  }
</script>

ref 属性

内容

获取单个 DOM。

<template>
  <!-- #3 -->
  <div ref="dom">我是box</div>
</template>
<script>
  import { onMounted, ref } from 'vue'
  export default {
    name: 'App',
    setup() {
      // #1
      const dom = ref(null)
      onMounted(() => {
        // #4
        console.log(dom.value)
      })
      // #2
      return { dom }
    }
  }
</script>

获取组件实例。

<template>
  <!-- #4 -->
  <button @click="changeName">修改子组件的 Name</button>
  <hr />
  <!-- #3 -->
  <Test ref="test" />
</template>
<script>
  import { ref } from 'vue'
  import Test from './Test.vue'
  export default {
    name: 'App',
    components: {
      Test
    },
    setup() {
      // #1
      const test = ref(null)
      const changeName = () => {
        test.value.changeName('elser')
      }
      // #2
      return { test, changeName }
    }
  }
</script>
<template>
  <div>
    <p>{{ o.name }}</p>
  </div>
</template>

<script>
  import { reactive } from 'vue'
  export default {
    setup() {
      const o = reactive({ name: 'ifer' })

      const changeName = (name) => {
        o.name = name
      }
      return {
        o,
        changeName
      }
    }
  }
</script>

Teleport

作用

传送,能将特定的 HTML 结构(一般是嵌套很深的)移动到指定的位置,解决 HTML 结构嵌套过深造成的样式影响或不好控制的问题。

<template>
  <div class="child">
    <teleport to="body">
      <dialog v-if="bBar" />
    </teleport>
    <button @click="handleDialog">显示弹框</button>
  </div>
</template>
<script>
  import { ref } from 'vue'
  import Dialog from './Dialog.vue'
  export default {
    name: 'Child',
    components: {
      Dialog
    },
    setup() {
      const bBar = ref(false)
      const handleDialog = () => {
        bBar.value = !bBar.value
      }
      return {
        bBar,
        handleDialog
      }
    }
  }
</script>