首页 > 其他分享 >【vue3入门】-【21】 组件传递数据

【vue3入门】-【21】 组件传递数据

时间:2024-05-07 23:13:15浏览次数:23  
标签:vue 21 title default vue3 传递 组件 props 传递数据

组件传递数据_Props

  • 静态数据传递

组件与组件之间不是完全独立的,而是有交集的,那就是组件与组件之间是可以传递数据的

传递数据的解决方案就是props

app.vue

<template>
  <!--主要要生效Header中的样式,需要删除main.json中默认的main.css样式-->
  <!--不需要再次引入,可以直接使用全局的组件-->
  <!-- <Header />   -->
  <!-- <Main />
  <Aside /> -->
  <parent />
</template>
<script>
// import Header from './pages/header.vue'
// import Main from './pages/main.vue'
// import Aside from './pages/aside.vue'
import parent from './components/parent.vue'

export default {
  components: {
    // Header,
    // Main,
    // Aside
    // 在最上层组件中引用父级组件
    parent
  }
}
</script>
<style></style>

parent.vue

<template>
    <h3>parent</h3>
    <!--在引用子级组件时可以跟上需要传递的参数值对,用以传递参数,而后被子级组件中的props中的数据接收-->
	<!--允许传递多个参数 空格间隔-->
    <child  title="parent数据"/>
</template>
<script>
import child from "./child.vue"


export default {
    data() {
        return {

        }
    },
    // 在父级组件中引用子级组件
    components: {
        child
    }
}
</script>
<style></style>

child.vue

<template>
    <h3>child</h3>
    <p>{{ title }}</p>
</template>
<script>

export default{
    data(){
        return{
            
        }
    },
    // 接收来自父级引用子级组件时传递的参数
    props:["title"] 
}
</script>
<style></style>
  • 动态数据传递

可以通过属性绑定的方式,动态传递数据

<template>
    <h3>parent</h3>
    <!--在引用子级组件时可以跟上需要传递的参数值对,用以传递参数,而后被子级组件中的props中的数据接收-->
    <child title="parent数据" />
    <!--动态传递数据-->
    <child :title="message" />
</template>
<script>
import child from "./child.vue"


export default {
    data() {
        return {
            message: "动态传递的数据"
        }
    },
    components: {
        child
    }
}
</script>
<style></style>

注意事项

props传递数据,只能从父级传递到子级,不能从子级传向父级

组件传递多种数据类型

通过props传递数据,不仅可以传递字符串类型的数据,还可以是其他类型,例如:数字、对象、数组等。

但实际上任何类型的值都可以作为props的值被传递

app.vue

<template>
  <!--主要要生效Header中的样式,需要删除main.json中默认的main.css样式-->
  <!--不需要再次引入,可以直接使用全局的组件-->
  <!-- <Header />   -->
  <!-- <Main />
  <Aside /> -->
  <parent />
</template>
<script>
// import Header from './pages/header.vue'
// import Main from './pages/main.vue'
// import Aside from './pages/aside.vue'
import parent from './components/parent.vue'

export default {
  components: {
    // Header,
    // Main,
    // Aside
    // 在最上层组件中引用父级组件
    parent
  }
}
</script>
<style></style>

parent.vue

<template>
    <h3>parent</h3>
    <!--在引用子级组件时可以跟上需要传递的参数值对,用以传递参数,而后被子级组件中的props中的数据接收-->
    <!--动态传递数据是使用属性绑定的方式-->
    <!--可以传递字符、数字、数组、对象等-->
    <child title="parent数据" :msg="message" :age="age" :names="names" :userInfo="user_info" />
</template>
<script>
import child from "./child.vue"


export default {
    data() {
        return {
            message: "动态传递的数据",
            age: 20,
            names: ["测试1", "测试2", "测试3"],
            user_info: {
                "name": "test1",
                "age": 30
            }
        }
    },
    components: {
        child
    }
}
</script>
<style></style>

child.vue

<template>
    <h3>child</h3>
    <p>{{ title }}</p>
    <p>{{ msg }}</p> <!--字符串类型-->
    <p>{{ age }}</p> <!--数字类型传递-->
    <ul>
        <li v-for="(value, index) of names">{{ value }}</li> <!--数组类型传递-->
    </ul>
    <p>{{ userInfo.name }}</p> <!--对象类型-->
    <p>{{ userInfo.age }}</p>
</template>
<script>

export default{
    data(){
        return{
            
        }
    },
    // 接收来自父级引用子级组件时传递的参数,需要和父级传递参数名同名
    props:["title","msg","age","names","userInfo"] 
}
</script>
<style></style>

组件传递props校验

vue组件可以更细致的声明对传入的props校验要求

  • 参数校验
<template>
    <h3>componentB</h3>
    <p>{{ title }}</p>
</template>
<script>
export default {
    data() {
        return {

        }
    },
    // 不带参数校验的父级参数接收方式
    // props: ["title"]

    // 带参数校验的父级参数接收方式
    props: {
        title: {
            // 传递非规定的类型数据时会存在console报错
            // type: Number
            // 也可以标记多种类型,只要满足其中一种就可以
            type: [String, Number, Array, Object]
        }
    }
}
</script>

参数类型传递错误时,存在console告警

image

  • 默认值校验
<template>
    <h3>componentB</h3>
    <p>{{ title }}</p>
    <p>{{ age }}</p>
    <p v-for="(value, index) of names">{{ value }}</p>
</template>
<script>
export default {
    data() {
        return {

        }
    },
    // 不带参数校验的传递方式
    // props: ["title"]

    // 带参数校验的传递方式
    props: {
        title: {
            // 传递非规定的类型数据时会存在console报错
            // type: String
            // 也可以标记多种类型,只要满足其中一种就可以
            type: [String, Number, Array, Object],
        },
        age: {
            type: Number,
            // 不传时,显示默认值,传递后显示传递的值
            // 注意:数字和字符串可以直接default,但是如果是数字和对象,必须通过工厂函数返回默认值
            default: 20
        },
        names: {
            type: Array,
            // 对于数组和对象类型的值,需要增加函数返回,不能直接返回
            default(){
                return ["空"]
            }

        }
    }
}
</script>
  • 必选项
<template>
    <h3>componentB</h3>
    <p>{{ title }}</p>
</template>
<script>
export default {
    data() {
        return {

        }
    },
    // 不带参数校验的传递方式
    // props: ["title"]

    // 带参数校验的传递方式
    props: {
        title: {
            // 传递非规定的类型数据时会存在console报错
            // type: String
            // 也可以标记多种类型,只要满足其中一种就可以
            type: [String, Number, Array, Object],
            // 必填项,如果父级没有传递对应参数时,console会存在告警
            required: true
        }
        }
    }

image

注意:props接收的数据是只读的,修改时会报错

<template>
    <h3>componentB</h3>
    <p>{{ title }}</p>
    <button @click="updatePropParam">修改props参数</button>
</template>
<script>
export default {
    data() {
        return {
        }
    },
    // 不带参数校验的传递方式
    // props: ["title"]

    // 带参数校验的传递方式
    props: {
        title: {
            // 传递非规定的类型数据时会存在console报错
            // type: String
            // 也可以标记多种类型,只要满足其中一种就可以
            type: [String, Number, Array, Object],
            required: true
        },
    },
    methods: {
        updatePropParam() {
            console.log(this.title);
            // 尝试修改props里面接口的参数数据时会存在异常报错,不允许修改父元素传递过来的数据
            this.title="新数据"
        }
    }
}
</script>

image

以上内容出自
【【2023最新版】Vue3从入门到精通,零基础小白也能听得懂,写得出,web前端快速入门教程】 https://www.bilibili.com/video/BV1Rs4y127j8/?share_source=copy_web&vd_source=94c3d5330a46438059359e8dd2494fe9

标签:vue,21,title,default,vue3,传递,组件,props,传递数据
From: https://www.cnblogs.com/T-Ajie/p/18178655

相关文章

  • 【vue3入门】-【22】 组件事件
    组件事件在组件的模版表达式中,可以直接使用$emit方法触发自定义事件触发自定义事件的目的是组件之间传递数据,通过组件事件可以实现子级传递参数给父级App.vue<template><ComponentEvent/></template><script>importComponentEventfrom"./components/componentEvent.......
  • 九龙城寨之围城下载/迅雷BT[HD-1280P/2.21GB/MP4中字]4k中字已更新
    《九龙城寨之围城》是一部以真实历史事件为背景的电影,讲述了1967年香港发生的九龙城寨事件。该片通过精彩的剧情、真实的场景和生动的角色,再现了当时发生的种种困境与挑战。影片不仅展示了九龙城寨的社会环境和居民生活,更呈现了人性的复杂与光辉。 电影以九龙城寨......
  • vue3.4中KeepAlive的一个bug
    KeepAlive可以缓存组件,在不使用include时没有任何问题,可以正常缓存。但是一旦使用了include,如果动态组件中没有导入ref函数,缓存功能就消失了比如editcom.vue<template><input></template><scriptsetup>import{ref}from'vue'</script><style></style&g......
  • 08-初始vue3
    写在前面https://juejin.cn/post/7106374777601785893https://juejin.cn/post/7253828299938906169配置项写法<body><divid="app"></div></body><script>constapp=Vue.createApp({//...})app.mo......
  • EXP-00056: ORACLE error 12154 encountered
    使用如下命令:--exp用户名/密码@数据库实例名file=导出文件名[参数]expscott/scott@orclfile=/expdat.dmpfull=y--正确方式expscott/scott@CONN_orclfile=/expdat.dmpfull=y出现了如下错误:EXP-00056:ORACLEerror12154encounteredORA-12154:TNS:couldnotr......
  • vue3
    【介绍】#vue3的变化1.性能的提升-打包大小减少41%-初次渲染快55%,更新渲染快133%-内存减少54%2.源码的升级使用Proxy代替defineProperty实现响应式重写虚拟DOM的实现和Tree-Shaking3.拥抱TypeScriptV......
  • 力扣1218.最长定差子序列
    题目给你一个整数数组arr和一个整数difference,请你找出并返回arr中最长等差子序列的长度,该子序列中相邻元素之间的差等于difference。​ 子序列是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从arr派生出来的序列。解题思路​ 动态规划1.常......
  • Unity面试手册:2021最新Unity面试题汇总
    1、什么是协同程序?答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个可以与程序并行的逻辑。可以用来控制运动、序列以及对象的行为。2、Unity3D中的碰撞器和触发器的区别?碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。......
  • 21.Prometheus告警之Alertmanager告警(一)-邮件钉钉微信
    一、Prometheus告警简介   告警能⼒在Prometheus的架构中被划分成两个独⽴的部分。如下所示,通过在Prometheus中定义AlertRule(告警规则),Prometheus会周期性的对告警规则进⾏计算,如果满⾜告警触发条件就会向Alertmanager发送告警信息 Alertmanager作为⼀个独⽴的组件,负责接......
  • vue3 个人自适应配置方案
    ``使用插件"postcss-pxtorem":"^6.1.0",postcss.config.cjs文件配置module.exports={plugins:{autoprefixer:{overrideBrowserslist:["Android4.1","iOS7.1","Chrome>31......