Skip to content

巧用 v-bind、v-on

v-bind

v-bind:arg.modifier="value"

v-bind:visible="isShow" 简写 :visible="isShow"

  • arg 表示参数
  • modifier 表示修饰符
  • value 表示值,类型为 any (带参数) 或 Object (不带参数)

绑定多个值:

html
<template>
  <info v-bind="infoOptions" />
</template>

<script setup>
  import { reactive } from 'vue'

  const infoOptions = reactive({
    name: 'Jack',
    age: 20
  })
</script>

v-on

v-on:arg.modifier1.modifier1="value"

  • arg 表示参数
  • modifier 表示修饰符
  • value 表示值

值可以是一个函数名、一个内联声明、一个对象

值是一个函数名或一个内联声明时,可以使用简写语法:

v-on:click="handleClick" 简写 @click="handleClick"

值是一个对象:

html
<template>
  <button v-on="buttonEvents">click</button>
</template>

<script setup>
  const buttonEvents = {
    mousedown() {

    },
    mouseup() {

    }
  }
</script>

当一个页面中多次使用某个大型组件(组件的 porps 或自定义事件比较多),推荐使用 v-bindv-on,而不是在模板中一个一个的绑定 props、自定义事件。

例1:v-bind 绑定 props,v-on 绑定事件:

html
<template>
  <Table v-bind="tableOptions" v-on="tableEvents" />
</template>

<script setup lang="ts">
  import { reactive } from 'vue'
  import { Table } from '@arco-design/web-vue'

  const tableOptions = reactive({
    columns: [
      { title: 'Name', dataIndex: 'name' },
      { title: 'Salary', dataIndex: 'salary' },
      { title: 'Address', dataIndex: 'address' },
      { title: 'Email', dataIndex: 'email' }
    ],
    data: [
      {
        key: '1',
        name: 'Jane Doe',
        salary: 23000,
        address: '32 Park Road, London',
        email: 'jane.doe@example.com'
      }
    ],
    rowSelection: {
      type: 'checkbox'
    }
    // 这种方式也可以
    // 'row-selection': {
    //   type: 'checkbox'
    // }
  })

  const tableEvents = {
    rowClick(record) {
      console.log(111, record)
    }
    // 这种方式不行
    // 'row-click': function (record) {
    //   console.log(111, record)
    // }
  }
</script>

例2:仅用 v-bind

html
<template>
  <Table v-bind="tableOptions" />
</template>

<script setup lang="ts">
  import { reactive } from 'vue'
  import { Table } from '@arco-design/web-vue'

  const tableOptions = reactive({
    columns: [
      { title: 'Name', dataIndex: 'name' },
      { title: 'Salary', dataIndex: 'salary' },
      { title: 'Address', dataIndex: 'address' },
      { title: 'Email', dataIndex: 'email' }
    ],
    data: [
      {
        key: '1',
        name: 'Jane Doe',
        salary: 23000,
        address: '32 Park Road, London',
        email: 'jane.doe@example.com'
      }
    ],
    rowSelection: {
      type: 'checkbox'
    },
    // 注意要在事件名前加上 on
    onRowClick(value) {
      console.log(1112, value)
    }
  })
</script>

推荐使用例1,例1分类清楚,不用改写事件名称。

例3:替换 v-model

v-model 实际是一种语法糖写法

html
<template>
  <Input v-bind="inputOptions" v-on="inputEvents" />
</template>

<script setup lang="ts">
  import { reactive } from 'vue'
  import { Input } from '@arco-design/web-vue'

  const inputOptions = reactive({
    modelValue: 'hello'
  })

  const inputEvents = {
    'update:modelValue': function (val) {
      inputOptions.modelValue = val
    }
  }
</script>

或者

html
<template>
  <Input v-bind="inputOptions" />
</template>

<script setup lang="ts">
  import { reactive } from 'vue'
  import { Input } from '@arco-design/web-vue'

  const inputOptions = reactive({
    modelValue: 'hello',
    // 注意这里没有加 on 前缀
    'update:modelValue': function (val) {
      this.modelValue = val
    }
  })
</script>