Vue3的数据传递和共享

本文介绍了Vue3中父组件通过ref和reactive向子组件传递数据,以及子组件如何通过defineProps接收数据。同时,讲解了子组件如何利用defineEmits向父组件传递数据,并展示了如何使用Vuex进行全局状态管理,以实现组件间的数据共享。最后,作者强调了这些技术在实际项目中的应用和学习的重要性。


前言

由于课程的项目前端开发结束,对于开发过程中遇到的问题解决和技术框架学习,我觉得还是要记录下来用来以后回忆,优化项目。希望大家不吝赐教,也欢迎大家来沟通交流学习!


一、Vue3的数据传递方式

Vue3的数据传递:
(1)父组件传递数据给子组件
(2)子组件传递数据给父组件
提示:除了以上两个可以实现组件之间的数据共享以外,我在项目开发后期接触到了Vuex状态项目管理,因此彷佛打开了数据的大门,所以此文章还会补充我用Vuex来进行数据管理

二、父组件传递数据给子组件

2.1 在父组件中

1、引入ref,reactive

import { reactive } from 'vue'

2、数据初始化,定义要传递的属性和属性值

let form = reactive({
	articleId:'',
	direction:''
})	

3、在父组件中导入并定义子组件,在子组件上绑定定义的属性并传递数据

//导入子组件
import modifyArticle from '@/components/modifyArticle.vue'
//定义子组件,并绑定定义的属性
<modifyArticle
	v-model:articleId = "form.articleId"
	v-model:direction = "form.direction">
</modifyArticle>	

2.2 在子组件中

1、引入defineProps接收父组件传来的属性值

//导入defineProps
import { defineProps } from 'vue'
//接收父组件传来的属性值
const props = defineProps({
	articleId: Number,
	direction: String
})

2、在子组件的标签中使用父组件传递来的属性值

//将父组件传递来的数据赋值给提前定义好的表单数据
const ruleForm = reactive({
	articleId: props.articleId,
	direction: props.direction
})
//在子组件的标签中使用,用的是element-plus组件库
<el-form
	:model="ruleForm"
	label-width="120px"
>   
	<el-form-item label="宣传文章ID">
		<el-input class="form_user" v-model="ruleForm.articleId"></el-input>
	</el-form-item>
	<el-form-item label="招生方向">
		<el-select v-model="ruleForm.direction" placeholder="请选择招生方向">
			<el-option label="嵌入式" value="嵌入式"></el-option>
            <el-option label="Java" value="Java"></el-option>
            <el-option label="大数据" value="大数据"></el-option>
            <el-option label="人工智能" value="人工智能"></el-option>
            <el-option label="Python" value="Python"></el-option>
          	<el-option label="前端" value="前端"></el-option>
         </el-select>
	</el-form-item>
</el-form>

提示:由于父组件传递给子组件的数据是一次性的,所以如果要父组件数据更新,子组件数据随之更新,需要用watch监听器来监听父组件的数据改变,后期我会把监听器的部分补上。

三、子组件传递数据给父组件

3.1 在子组件中

1、引入defineEmits

import { defineEmits } from 'vue'

2、数据初始化,定义要传递的属性和属性值

let ruleForm = reactive({
	articleId:'',
	direction:''
})	

3、在子组件中定义需要传递给父组件中指定的属性或者方法的值

//定义
const emit = defineEmits(['modifyFormValues'])
//传递
emit('modifyFormValues',ruleForm)	

3.2 在父组件中

在父组件中定义的子组件属性标签上接收子组件传入的自定义属性名,并绑定在父组件自定义的属性或方法上

//定义并绑定自定义属性到子组件属性标签
<modifyArticle
	@modifyFormValues = "get_modifyFormValues"
>
</modifyArticle>
//父组件自定义的get_modifyFormValues方法接收子组件数据
const get_modifyFormValues = (values) => {
	console.log("文章编号:"+values.articleId+",招生方向:"+values.direction)
}

四、补充:Vuex状态管理实现数据的共享

1、在src文件夹下创建store文件夹,并创建index.js文件存储管理宣传文章状态

//导入vuex
import { createStore } from 'vuex'
//声明全局的状态初始值,并设置修改的触发方法
export default createStore({
	state:{
		articleInfo:{
			articleId:'',
			directtion:''
		}
	},
	mutations:{
		setArticleInfo(state, articleload){
			state.articleInfo = articleload;
		}
	}
})

2、在需要调用的组件中创建vuex实例,再获取属性值

//导入vuex
import { useStore } from 'vuex'
//创建vuex实例
const store = useStore()
//使用宣传文章的状态存储
const ruleForm = reactive({
	articleId:'',
	direction:''
})
ruleForm.article = store.state.articleInfo.articleId
ruleForm.direction = store.state.articleInfo.direction

总结

通过这次项目开发,简单地接触了Vue3的部分知识,出于锻炼自己开发能力的目的,我在项目中简单使用了这三个方式进行数据共享和传递,并且简单整理成了这篇文章,如有不足,望见谅!如果能给我指出,将不胜感激!

Vue 3 有多种数据传递方式,下面介绍几种常见的方法及其实现: ### Props 传递 在父组件向子组件传递数据时可使用 Props。在父组件中通过属性绑定的方式传递数据给子组件,子组件接收这些数据。示例代码如下: ```vue <!-- 父组件 --> <template> <!-- 传递数据到子组件 --> <User name="Jack" age="50" :sex="sex"></User> </template> <script> import { ref } from "vue"; import User from "./components/User.vue"; export default { name: "App", components: { User }, setup() { let sex = ref("男"); return { sex }; } } </script> ``` 在子组件 `User.vue` 中接收这些数据: ```vue <template> <div> <p>Name: {{ name }}</p> <p>Age: {{ age }}</p> <p>Sex: {{ sex }}</p> </div> </template> <script> export default { props: { name: String, age: String, sex: String } } </script> ``` ### provide inject 实现隔代数据传递 当需要在隔代组件之间传递数据时,可以使用 `provide` `inject`。在祖先组件中使用 `provide` 提供数据,后代组件使用 `inject` 注入数据。示例代码如下: ```vue <!-- 祖先组件 --> <script> import { ref, provide } from "vue"; export default { setup() { let counter = ref(1); // 在祖先组件使用 provide 提供数据 provide("counter", counter); return counter; } } </script> ``` 在后代组件中注入数据: ```vue <script> import { inject } from "vue"; export default { setup() { const counter = inject("counter"); return { counter }; } } </script> ``` ### 事件总线 虽然 Vue 3 移除了全局事件总线,但可以通过第三方库如 `mitt` 来实现类似功能。首先安装 `mitt`: ```bash npm install mitt ``` 然后创建一个事件总线实例: ```javascript // eventBus.js import mitt from &#39;mitt&#39;; const emitter = mitt(); export default emitter; ``` 在发送数据的组件中: ```vue <template> <button @click="sendData">Send Data</button> </template> <script> import emitter from &#39;./eventBus.js&#39;; export default { setup() { const sendData = () => { const data = { message: &#39;Hello from component&#39; }; emitter.emit(&#39;customEvent&#39;, data); }; return { sendData }; } } </script> ``` 在接收数据的组件中: ```vue <script> import emitter from &#39;./eventBus.js&#39;; export default { setup() { const receiveData = () => { emitter.on(&#39;customEvent&#39;, (data) => { console.log(&#39;Received data:&#39;, data); }); }; receiveData(); return {}; } } </script> ``` ### Vue Router 参数传递Vue 应用中,路由参数传递是实现页面间数据交互的重要手段。Vue Router 提供了多种方法来传递接收数据,使得在不同页面之间能够方便地共享传递信息。 - **通过路径参数传递数据**:使用动态路由与路径参数,在组件中获取路径参数。例如在路由配置中: ```javascript const routes = [ { path: &#39;/user/:id&#39;, component: User } ]; ``` 在组件中获取参数: ```vue <script> import { useRoute } from &#39;vue-router&#39;; export default { setup() { const route = useRoute(); const userId = route.params.id; return { userId }; } } </script> ``` - **通过查询参数传递数据**:使用 URL 查询字符串传递数据,在组件中获取查询参数。例如路由跳转时: ```javascript router.push({ path: &#39;/search&#39;, query: { keyword: &#39;vue&#39; } }); ``` 在组件中获取查询参数: ```vue <script> import { useRoute } from &#39;vue-router&#39;; export default { setup() { const route = useRoute(); const keyword = route.query.keyword; return { keyword }; } } </script> ``` - **通过路由状态传递数据**:路由跳转时传递状态,在组件中获取状态。例如路由跳转时: ```javascript router.push({ path: &#39;/dashboard&#39;, state: { message: &#39;Welcome&#39; } }); ``` 在组件中获取状态: ```vue <script> import { useRoute } from &#39;vue-router&#39;; export default { setup() { const route = useRoute(); const message = route.state.message; return { message }; } } </script> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值