当前位置: 首页 > article >正文

vue父子传参的方式——Prop

Prop

每一个组件都有一个props的属性,用来接收外部传递的数据

这里我拿一个分页组件为例:

一、基础语法

1、父组件传递数据

父组件在向子组件传递数据时,基础语法如下:

<template>
    <div>
        <common-page :pagination="pagination" @change="handlePageChange"/>
    </div>
</template>

<script>
import CommonPage from '@/components/common/CommonPage'
export default {
    components: {
        CommonPage,
    },
    data() {
        return {
            /* 分页参数 */
            pagination: {
                current: 1,
                pageSize: 10,
                total: 0,
                pageSizeOptions: [10, 20, 30, 50, 100],
                showQuickJumper: true,
                showSizeChanger: true,
            },
        };
    },
    methods: {
        //分页、筛选变化时触发
        handlePageChange({ pageSize, current }) {
            this.pagination.current = current
            this.pagination.size = pageSize
        },
    }
};
</script>

传递的数据中,除了静态的字符串以外,其他所有数据在传递时,都需要通过v-bind进行传递。

2、子组件接受数据

export default {
    props: {
        pagination: {
            type: Object, // 指定属性的类型为对象。
            required: true, // 指定属性是必需的,即在使用该组件时必须传递这个属性。
        },
    }
}

3、子组件访问 Props

<template>
    <div class="pagination">
        <el-pagination @size-change="handleSizeChange" 
                       @current-change="handleCurrentChange"
                       :page-sizes="pagination.pageSizes?pagination.pageSizes:[5, 10, 20, 30, 40, 50]"
                       :page-size.sync="pagination.pageSize"
                       :current-page.sync="pagination.current"
                       :pagerCount="pagerCount"
                       :small="small"
                       :layout="layout"
                       :total="pagination.total">
        </el-pagination>
    </div>
</template>

<script>
    export default {
        name: 'common-page',
        props: {
            pagination: {
                type: Object,
                required: true,
            },
            layout: {
                type: String,
                default: 'total, sizes, prev, pager, next, jumper',
            },
            small: {
                type: Boolean,
                default: false,
            },
            pagerCount: {
                type: Number,
                default: 7
            },
        },
        mounted() {
            console.log(this.pagination, this.pagerCount)
        }
    }
</script>

二、单向数据流

概念

单向数据流,指的是父组件将数据通过 props 传递给子组件后,父组件更新数据, 子组件 props 的数据会同步更新,但是,反过来则不行,子组件不能修改 props 数据。

当父组件将数据传递给子组件后,父组件如果更新数据,子组件会同步更新,但是,子组件中不能修改 props 接收的数据。

结论:子组件中不能修改 Prop 的数据

解决方案

如果确实有需要修改 props 的要求,可以有如下两种解决方案:

1、将 props 赋值给 data
export default {
    props: {
        pagination: {
            type: Object,
            required: true,
        },
    },
    data() {
        return {
            sonPagination: this.pagination
        }
    }
}
2、将 props 赋值给 computed
export default {
    props: {
        pagination: {
            type: Object,
            required: true,
        },
    },
    computed: {
        sonPagination() {
            return this.pagination
        }
    }
}

三、Prop 的验证

  export default {
        props:{
            name:String,
            age: [Number,String],
            num:{
                type:Number,    //类型
                required:true,  // true为必传
            },
            gender:{
                type:String,
                default:"保密" //默认值
            },
            // 如果默认值是数组或对象
            friends:{
                type:Array,
                default: ()=>["张三","李四"],
            },
            teacher:{
                type:Object,
                default:()=>({name:"王五"}),
            },
            classes:{
                validator(value){
                    return ['web21','web22','web23'].includes(value)
                }
            }
        }
    }


http://www.kler.cn/news/365207.html

相关文章:

  • C++20中头文件syncstream的使用
  • 证件照电子版怎么弄?不花钱制作方法快来学
  • 数字图像处理的概念(一)
  • 数据仓库宽表概述
  • Mysql-count(1)、count(*)和count(列名)的区别?
  • Java 监听器示例(非界面)
  • 2024NENU新生培训-排序
  • BUUCTF re rsa做法(提供enc和key)
  • 【Linux】守护进程与作业控制:进程组、会话与控制终端
  • micro-app【微前端实战】主应用 vue3 + vite 子应用 vue3+vite
  • 【Python】相等性比较运算(==, is)的学习笔记
  • 认识ldconfig,不仅仅可以用于查看库的版本
  • 力扣143:重排链表
  • 高可用之限流 09-guava RateLimiter 入门使用简介 源码分析
  • Linux系统下kazam生成的.mp4文件无法用window打开
  • 学习游戏测试需要掌握哪些基础技术?
  • django5入门【01】环境配置
  • 五大场景实践 深度解读指标平台业务价值
  • ffmpeg视频滤镜:平均模糊
  • 【系统架构设计师】一、绪论
  • 第五届光学与图像处理国际学术会议(ICOIP 2025)征稿中版面有限!
  • Android——应用安装
  • Paramiko实现SSH自动化实战教程
  • 2024-09学习笔记
  • TCP/UDP 通用通信代码库(C语言实现)
  • java高性能处理10G大文件