前端面试——父子组件传值

记录集中父子组建传值的方法

一.自定义事件进行父子组件直接传值

直接看往期文章:超详细vue3组合式父子组件传值_vue3父子组件传值-CSDN博客

二.vue3自带API——proviede/inject

我们在子组件迭代层数很深,但是又需要很远的父组件的数值,我们就需要使用proviede/inject来防止出现props透传

我的顶级父组件:AboutView,vue

这里面注入了一个函数和一个方法到provide当中

<template>
  <div>
    这是测试页面

    <MsgItem :msg="values"></MsgItem>
  </div>
</template>

<script lang="ts" setup>
import { provide, ref } from 'vue'
import MsgItem from './MsgItem.vue'

const values = ref('666')
const myFun = (nums: number) => {
  console.log('myFun', nums * 10)
}

provide('myFun', myFun)
provide('values', values)
</script>

<style lang="scss" scoped></style>

我的第二级组件:MsgItem.vue

<template>
  <div>
    这是MsgItem
    <MsgItemItem></MsgItemItem>
  </div>
</template>

<script lang="ts" setup>
import MsgItemItem from './MsgItemItem.vue'
</script>

<style lang="scss" scoped></style>

我的第三级组件:MsgItemItem.vue

<template>
  <div>是MsgItemItem</div>
</template>

<script lang="ts" setup>
import { inject, onMounted } from 'vue'

const values = inject('values')
const myFun = inject('myFun')
onMounted(() => {
  console.log(values, myFun(100))
})
</script>

<style lang="scss" scoped></style>

PS:如果不是父子组件关系,那么就会显示undefined

三.Vuex

 我们首先下载Vuex,作者本人原本的项目使用node V16.14.2下载不下来Vuex4.x.x,索性后面切换Node V18.18.1 然后pnpm下载的Vuex 4.1.0

首先新建一个文件存储全局变量:

// /src/vuex.js
import { createStore } from 'vuex'

const store = createStore({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      console.log('访问mutations ++')
      state.count++
    }
  },
  actions: {
    async increment({ commit }) {
      console.log('访问commit')
      for (let i = 0; i < 10; i++) {
        await commit('increment')
      }
    },
    test({ state }) {
      console.log('访问test commit')
      state.count--
    },
    test2({ commit }) {
      console.log('访问test2 commit')
      commit.count++
    }
  },
  getters: {
    count(state) {
      console.log('访问getter')
      return state.count
    }
  }
})
export default store

这里面有四个部分

state:声明全局状态,直接定义初始数据即可

mutations:执行对state里面定义的状态的更改操作,只允许使用state作为参数

actions:执行处理逻辑,支持异步操作。可以使用state,commit,dispatch.getters作为参数

gettters: 可以缓存函数的结果,使得代码简洁。支持state和getters作为参数

在Vue中对Vuex进行的对应操作的代码(store为useStore()实例):
序号操作对应调用
1store.state.xxx state
2store.commit("xxx")mutations
3store.dispatch("xxxx")actions
4store.getters("xxxx")getters

然后挂载到Vue实例,这样就可以使用useStore()

// /src/main.ts
import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import router from './router'

import store from './vuex' // 引入 store

const app = createApp(App)

app.use(createPinia())
app.use(router)
app.use(store) // 挂载到实例,就可以使用 useStore
app.mount('#app')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSU_曾是此间年少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值