个人博客 个人博客
首页
  • 前端
  • 后端
  • Git
  • Docker
  • 网络
  • 操作系统
工具
阅读
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

董先亮

前端react开发
首页
  • 前端
  • 后端
  • Git
  • Docker
  • 网络
  • 操作系统
工具
阅读
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Vue

    • 响应式API
    • vite环境变量
    • 侦听
    • 样式
    • 多环境配置
    • 实现页面缓存
    • 组件封装
      • defineProps
      • defineEmits
      • v-model
    • nextTick
    • 组件传值
    • 批量导入
    • 插槽
    • scoped与deep原理
    • v-model
    • vue-router
    • 项目全局
    • 自定义hook
  • React

  • 前端框架
  • Vue
NeverStop1024
2022-11-09
目录

组件封装

# defineProps

defineProps只能在<script setup>中使用,用来接收props

// 仅<template> 中使用 propA、propB
defineProps({
  propA: { type: [Number, String], default: '' },
  propB: { type: Number, default: 2 }
});

// <script> 中也使用 propA、propB, 声明为变量
const props = defineProps({
  propA: { type: [Number, String], default: '' },
  propB: { type: Number, default: 2 }
});
1
2
3
4
5
6
7
8
9
10
11

# defineEmits

用来定义子组件可接收的事件

// 父组件
<children @onClick="handleClick"/>

// 子组件
<template>
  <div @click="onClick">children</div>
</template>

<script setup>
  // 定义emit
  const emit = defineEmits(["onClick"]);
  // 调用父对应回调
  const onClick = () => emit("onClick");
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# v-model

v-model原理

// 父组件
<template>
  <children :msg="msg" @update:msg="handleChangeMsg"/>
</template>

<script>
  export default {
    data:{
      msg: 'hello,coder'
    },
    methods: {
      handleChangeMsg(v){
        this.msg = v
      }
    }
  }
</script>


// 子组件children
<template>
  <div>{{msg}}</div>
  <button @click="handleClick">点击</button>
</template>

<script>
  export default {
    props:['msg'],
    emits:['update:msg'],
    methods:{
      handleClick(){
        this.$emit('update:msg','hello,world');
      }
    }
  }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

当我们绑定一个state时,默认会绑定一个事件,比如

  • v-model:open="open"
  • 会默认绑定一个事件@update:open="(v) => open = v"
  • v-model默认绑定value,其他值加:,如:v-model:open=""

使用v-model封装组件,vue3

// 父组件
<template>
  <children v-model:msg="msg"/>
</template>

<script>
  export default {
    data:{
      msg: 'hello,coder'
    },
  }
</script>


// 子组件children
<template>
  <div>{{msg}}</div>
  <button @click="handleClick">点击</button>
</template>

<script setup>
  defineProps({
    msg: { type: [String], default: '' },
  });
  const emit = defineEmits();
  
  const handleClick(){
    emit('update:msg','hello,world');
  }
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

v-model默认传值
v-model默认传值为modelValue,二次封装el-dialog

<el-dialog :modelValue="visible"  @close="cancel" >
</el-dialog>
<script>
const emits = defineEmits()
// 取消编辑
const cancel = () => {
  resetForm()
  emits('update:visible',false)
}
</script>
1
2
3
4
5
6
7
8
9
10

如果封装el-dialog子组件也用v-model="visible",打包时会报Use a v-bind binding combined with a v-on listener that emits update:x event instead错误
参考

  • 使用v-model的示例分析 (opens new window)
  • Vue3复习:组件的v-model (opens new window)
编辑 (opens new window)
上次更新: 2023/01/05
实现页面缓存
nextTick

← 实现页面缓存 nextTick→

最近更新
01
mock使用
07-12
02
websocket即时通讯
07-12
03
前端面试题
07-09
更多文章>
Theme by Vdoing | Copyright © 2022-2023 NeverStop1024 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式