• 自定义子组件的v-model


    一、传统的父子传参

            作为前端程序员,我们在开发时,用到最多的就是父子传参了吧,这一点相信大家都很熟悉了,在这里简单的说一下

            1.父传子

            (1)  在父组件中引入子组件,并在父组件的components中注册该组件

    1. import Son from './son'
    2. export default {
    3. name: 'Father',
    4. components: {
    5. Son
    6. }
    7. }

              (2)在父组件中将该子组件当正常标签一样使用,将要传递的数据用子组件的属性去传递

    1. <template>
    2. <div>
    3. <Son type="666" />
    4. div>
    5. template>

            (3)在子组件的props里面去接收父组件传递的值,并说明类型

    1. export default {
    2. name: 'Son',
    3. props: {
    4. type: String
    5. }
    6. }

            (4)此时,父组件传递的值就可以在子组件中和子组件本身的data中的数据一样使用了

    1. <template>
    2. <div>
    3. 来自父组件的 {{ type }}
    4. div>
    5. template>

            2.子传父

            (1)在父组件中写该子组件的标签上去自定义一个事件类型,并绑定一个对应的事件处理函数,该函数的参数即是子组件传递过来的数据

    1. <template>
    2. <div>
    3. <Son @toFather="fromSon" />
    4. div>
    5. template>
    6. <script>
    7. import Son from './son'
    8. export default {
    9. name: 'Father',
    10. components: {
    11. Son
    12. },
    13. methods: {
    14. fromSon(data) {
    15. console.log('子组件传递的参数',data )
    16. }
    17. }
    18. }
    19. script>

            (2)在子组件中通过$emit去调用父组件中自定义的事件类型对应的事件,$emit的第一个参数为对应的父组件的事件类型,第二个参数为要传递的数据。

    1. <template>
    2. <div>
    3. <button @click="dataToFather" />
    4. div>
    5. template>
    6. <script>
    7. export default {
    8. name: 'Son',
    9. data() {
    10. return {
    11. sonData: '子组件的数据'
    12. }
    13. },
    14. methods: {
    15. dataToFather() {
    16. this.$emit('toFather', this.sonData)
    17. }
    18. }
    19. }
    20. script>

            那么有没有一种方法可用更简便的实现同一个值的父子互传呢?在我说出这个问题时候相信很多人都感觉哪里很熟悉吧!听起来是不是和v-model很像?事实上,自定义组件也可以自定义v-model!

     二、自定义子组件的v-model

             1.首先我们需要在父组件中正常的引入子组件,并将其当做标签使用

    1. <template>
    2. <div>
    3. <Son />
    4. div>
    5. template>
    6. <script>
    7. import Son from './son'
    8. export default {
    9. name: 'Father',
    10. components: {
    11. Son
    12. }
    13. }
    14. script>

            2.我们要去子组件中去制定改子组件的v-model的使用规则:与data同级的地方写一个model,其对应的属性值为一个对象,包含两个属性:

    • prop:此属性是用来绑定在使用v-model后子组件中要改变的值是哪个的
    • event:此属性是用来代替原来在父组件中子组件标签上面的自定义事件类型的,后续使用$emit去调用的就是这个事件类型

            在这里还要注意,在props里面还是需要正常去接收该值并说明类型的,否组无法在子组件中拿到并使用

    1. <script>
    2. export default {
    3. name: 'Son',
    4. model: {
    5. prop: 'value', // 父组件的v-model所绑定的值是这里的prop的属性值对应的props中的值
    6. event: 'change' // 定义通过$emit去调用的父组件的事件,在父组件的v-model改变时则会按照这个方法去处理
    7. },
    8. props: {
    9. value: String, // 接受父组件传递的v-model后面值的类型,必须在此注册不然没法使用
    10. },
    11. }
    12. script>

            3.到这里,我们就可以在父组件中子组件标签上面使用v-model了

    1. <template>
    2. <div>
    3. 父组件{{ sonData }}
    4. <Son v-model="sonData" type="66" />
    5. <el-input v-model="sonData" clearable maxlength="200" />
    6. div>
    7. template>
    8. <script>
    9. import Son from './son'
    10. export default {
    11. name: 'Father',
    12. components: {
    13. Son
    14. },
    15. data() {
    16. return {
    17. sonData: '2'
    18. }
    19. }
    20. }
    21. script>

            4.在子组件中通过$emit去向父组件传递由v-model绑定的数据

    1. <template>
    2. <div>
    3. <el-input v-model="toFather" clearable maxlength="200" @change="change" />
    4. div>
    5. template>
    6. <script>
    7. export default {
    8. name: 'Son',
    9. model: {
    10. prop: 'val1ue', // 父组件的v-model所绑定的值是这里的prop的属性值对应的props中的值
    11. event: 'change' // 定义通过$emit去调用的父组件的事件,在父组件的v-model改变时则会安装这个方法去处理
    12. },
    13. props: {
    14. value: String, // 接受父组件传递的v-model后面值的类型,必须在此注册不然没法使用
    15. },
    16. data() {
    17. return {
    18. toFather: '子组件的数据'
    19. }
    20. },
    21. methods: {
    22. change() {
    23. this.$emit('change', this.toFather)
    24. }
    25. }
    26. }
    27. script>

            走到这一步,我们的自定义v-model就算是完成了,我们会发现,在父组件中改变 中的sonData时,子组件中的value会跟着改变,同样,在子组件中通过改变去调用change方法时,该方法也会通过我们置顶好的规则去将参数传递给父组件中v-model所绑定的sonData!


    大家也可以去参考官方文档:自定义事件 — Vue.js (vuejs.org)

  • 相关阅读:
    2022年湖北武汉建设厅七大员在哪里报考呢?个人可以报名吗?甘建二
    48 路径总和 III
    五大经典智能算法实现机器人路径规划,包含简单路径与复杂路径,详细对比实验...
    C语言二维数组编程练习集
    MySQL绕过WAF实战技巧
    python---文件的操作、异常处理、模块、包
    网络安全(黑客)自学
    手把手带你使用Paint in 3D和Photon撸一个在线涂鸦画板
    IMAU鸿蒙北向开发-2023年9月5日学习日志
    关于数据权限的设计
  • 原文地址:https://blog.csdn.net/gkx19898993699/article/details/133354864