首页 > 其他分享 >03_组件、事件、插槽、发布订阅

03_组件、事件、插槽、发布订阅

时间:2024-06-23 11:20:39浏览次数:22  
标签:03 vue console log 插槽 value 组件 import

文档:组件基础 | Vue.js (vuejs.org)

什么是组件:

vue组件可以将一个复杂的应用程序(或者是页面)拆分成多个小的模块,每个模块可以独立的进行开发和测试。在Vue当中组件是通过虚拟DOM来实现的,可以将复杂的页面拆分多个小的DOM节点,每个节点对应一个组件,然后这些组件组合成一个完整的页面。

 

1.定义一个组件

当使用构建步骤时,我们一般会将 Vue 组件定义在一个单独的 .vue 文件中,这被叫做单文件组件 (简称 SFC):

ButtonCounter.vue

<!-- 写js代码,或者vue代码 -->
<script setup>
import { ref } from 'vue'
// 定义组件可以接收的参数
// 参数为单向数据流
// ROOT <- Button <- Submit
// ROOT -> Button -> Submit
// step: 只能在父组件进行修改,不能在子组件进行修改
const props = defineProps({
    // 定义参数
    // 参数名: 参数数据类型
    // step: Number
    step: {
        type: Number, // String, Array, Object
        // 必须要传递参数
        // required: true,
        // 设置默认值
        default: 8,
        // 自定义校验规则
        validator: function(value) {
            console.log("传递的参数是:", value)
            // true: 校验通过
            // false: 校验失败
            // 传递的值必须要小于10
            if (value<10) {
                return true
            } else {
                return false
            }
             
        }

    }
})
const count = ref(0)
const plus = ()=>{
    count.value = count.value + props.step
}
</script>
<!-- 写html文档 -->
<template>
    <div>
        <p>你传递的参数是: {{ props.step }}</p>
        <button class="button" @click="plus">You clicked me {{ count }} times.</button>
    </div>
</template>   
<!-- 写组件的样式,scoped表示只对当前页有效 -->
<style scoped>
.button{
    font-size: 20px;
    background-color: aqua;
}
</style>

 

要使用一个子组件,我们需要在父组件中导入它。

<script setup>
import ButtonCounter from './ButtonCounter.vue'
</script>

<template>
  <h1>Here is a child component!</h1>
  <ButtonCounter :step="2" />
</template>

 

2.触发与监听事件

 Message.vue

<!-- 写js代码,或者vue代码 -->
<script setup>
import { ref } from 'vue'
// 定义组件可以接收的参数
// 参数为单向数据流
const props = defineProps({
    msg: {
        type: String, // String, Array, Object
    }
})
const emit = defineEmits(['changeValue'])
// 子组件内不能修改父组件的值
const modifyMsg = ()=>{
    // 直接改不可以的
    // props.msg = "这是通过子组件直接进行修改的值"
    // 通过事件让父组件进行修改,changValue对应App.vue中的@change-value
    emit('changeValue',"这里是传到父组件的参数")
}
</script>
<!-- 写html文档 -->
<template>
    <div>
       {{ msg }}
       <button placeholder="请输入值" type="button" @click="modifyMsg">修改</button>
    </div>
</template>   
<!-- 写组件的样式 -->
<style scoped>
.button{
    font-size: 20px;
    background-color: aqua;
}
</style>

 

父组件App.vue

import Message from './components/Message.vue';
import { ref } from 'vue'
const msg = ref("这是父组件传递的参数")
const modify = (value) => {
  // 由父组件直接更改
  // msg.value = "这是一个新值,由子组件触发"
  // 接收参数进行修改
  msg.value = value
}


<template>
  <Message :msg="msg" @change-value="modify"></Message> 
</template>

 

 

3.插槽

SlotDemo.vue

<script setup>
import { onBeforeMount, onMounted,onBeforeUpdate,onUpdated, onBeforeUnmount ,onUnmounted } from 'vue';

// 插槽: 插槽是vue中一种特殊的机制,他可以让我们在组件中定义可插入区域、
// 也就是可以在不同的地方插入不同的内容
// 可以让一个通用的组件,展示不同的内容
// beforeUpdate --> onBeforeUpdate
onBeforeUpdate(
    () => {
        console.log("钩子函数: onBeforeUpdate")
    }
)
// updated --> onUpdated
onUpdated(
    () => {
        console.log("钩子函数: onUpdated")
    }
)
// beforeUnmount --> onBeforeUnmount , vue2: beforeDestory
onBeforeUnmount(
    () => {
        console.log("钩子函数: onBeforeUnmount")
    }
)
// unmounted --> onUnmounted ,vue2: destroyed
onUnmounted(
    () => {
        console.log("钩子函数: onUnmounted")
    }
)
</script>
<template>
    <div>
       <!-- 定义一个插槽 -->
       <!-- name=default -->
       <!-- 具名插槽,命名插槽 -->
       <slot name="header">
         <p>这是插槽的默认值</p>
       </slot>
       <slot name="main">
         <p>这是插槽的默认值</p>
       </slot>
       <slot name="footer">
         <p>这是插槽的默认值</p>
       </slot>
    </div>
</template>

<style>
</style>

 父组件App.vue

import SlotDemo from './components/SlotDemo.vue';

<template>
  <!-- 使用插槽这个组件 -->
  <SlotDemo>
    <!-- 第一种写法 -->
    <template v-slot:header>
      <p>这是header头定义</p>
    </template>
    <template #main>
      <div style="background-color: aqua; width: 200px; height: 200px;">
        <p>这是main中内容</p>
      </div>
    </template>
    <template #footer>
      <p>尾部的定义</p>
    </template>
  </SlotDemo>

</template>

 

4.发布与订阅

父组件ProvideInject.vue

<script setup>
import MessageProvide from './MessageProvide.vue'
import { provide, readonly, ref } from 'vue';

// 订阅和发布数据
// provide:用来发布数据
// inject:用来订阅数据
let defaultMsg = ref("这是父组件发布的数据")
// 发布一个数据
// provide语法: provide("发布的命令","你要发布谁")
// 发布数据
// provide('message', defaultMsg)
// 发布只读数据
provide('message', readonly(defaultMsg))

// 发布一个用于修改数据的函数
const modifyHandler = (newValue) => {
    defaultMsg.value = newValue
}
provide('modifyHandler',modifyHandler)
</script>

<template>
   <MessageProvide></MessageProvide>
</template>

 

子组件MessageProvide.vue

<script setup>
import { inject,ref, onBeforeMount, onMounted,onBeforeUpdate,onUpdated, onBeforeUnmount ,onUnmounted } from 'vue';

// 订阅父组件发布的数据
// inject语法: inject('数据的名字')
let injectMsg = inject("message")
// 订阅父组件发布的修改数据的函数
const changeValueHandler = inject("modifyHandler")
let newMsg = ref('')
const submit = ()=> {
    console.log("提交数据")
    // 也是可以直接通过子组件修改数据的
    // injectMsg.value = newMsg.value // 不推荐
    changeValueHandler(newMsg.value)
}
// beforeUpdate --> onBeforeUpdate
onBeforeUpdate(
    () => {
        console.log("钩子函数: onBeforeUpdate")
    }
)
// updated --> onUpdated
onUpdated(
    () => {
        console.log("钩子函数: onUpdated")
    }
)
// beforeUnmount --> onBeforeUnmount , vue2: beforeDestroy
onBeforeUnmount(
    () => {
        console.log("钩子函数: onBeforeUnmount")
    }
)
// unmounted --> onUnmounted ,vue2: destroyed
onUnmounted(
    () => {
        console.log("钩子函数: onUnmounted")
    }
)
</script>

<template>
    <div>
        <p style="color: red;">{{ injectMsg }}</p>
        <input placeholder="请输入新值" v-model="newMsg" />
        <button type="button" style="background-color: aqua;" @click="submit">修改</button>
    </div>
</template>

 

5.生命周期钩子

生命周期钩子 | Vue.js (vuejs.org)

 

标签:03,vue,console,log,插槽,value,组件,import
From: https://www.cnblogs.com/MingQiu/p/18263129

相关文章

  • 【区分vue2和vue3下的element UI Descriptions 描述列表组件,分别详细介绍属性,事件,方法
    在ElementUI(为Vue2设计)和ElementPlus(为Vue3设计)中,Descriptions(描述列表)组件通常用于展示一系列的结构化信息。然而,需要明确的是,ElementUI官方库中并没有直接名为Descriptions的组件,但在ElementPlus中,该组件是存在的。以下将分别介绍ElementPlus中的De......
  • 【区分vue2和vue3下的element UI Result 结果组件,分别详细介绍属性,事件,方法如何使用,并
    在Vue2中,ElementUI并没有直接提供名为Result的组件。但是,在Vue3的ElementPlus中,Result组件是用来展示操作结果或状态信息的。以下是ElementPlus中Result组件的详细介绍,以及如何在Vue3中使用它。由于Vue2没有该组件,我将只介绍Vue3下的使用。Vu......
  • N32G031 IWDG使用
    目录IWDG功能简介N32G031IWDG使用步骤示例代码(简化版)N32G031是一款基于ARMCortex-M0内核的32位微控制器,由南京沁恒微电子股份有限公司设计。该系列微控制器广泛应用于工业控制、消费电子、物联网等领域。IWDG(IndependentWatchdog)即独立看门狗,是一个重要的系统可靠性组......
  • DRF 报错:RuntimeError: Model class django.contrib.contenttypes.models.ContentType
    该错误发生于将'django.contrib.contenttypes'注释之后该组件的功能见如下链接:https://www.cnblogs.com/xiugeng/p/9831665.htmldrf的APIView内部会走认证源码,相关代码导致的报错,怎么解决呢?就是在settings.py中配置上如下两个参数(匿名用户和认证)即可:https://www.cnblogs.com/N......
  • 红队内网攻防渗透:内网渗透之内网对抗:横向移动篇&入口切换&SMB共享&WMI管道&DCOM组件&I
    红队内网攻防渗透1.内网横向移动1.1WMI进行横向移动1.1.1利用条件:1.1.1利用详情1.1.1.1wmic1.1.1.1.1正向shell上线1.1.1.1.2反向shell上线1.1.1.2cscript(不建议使用)1.1.1.3wmiexec-impacket1.1.1.4cs插件1.2SMB横向移动1.2.1利......
  • 【后台管理系统】Vuex实现简单组件间通信
    Vuex是组件间通信的一种方式,可以实现任意组件间的通信。官方文档:开始|Vuex(vuejs.org)https://vuex.vuejs.org/zh/guide/Vuex应用的核心其实就是一个共享的仓库store,在store.state中储存你需要修改的状态,在mutation中储存修改状态的方法,再使用commit提交修改方法。如果需......
  • Vue3的Composition API:Composition API是Vue3的一大新特性,它提供了一种更灵活的方式来
    1.介绍1.什么是CompositionAPI CompositionAPI是Vue.js3.0中引入的一项新特性,提供了一种新的、更灵活的方式来组织Vue组件的代码。CompositionAPI是基于函数的,并允许在组件的setup函数中直接处理响应式数据和生命周期钩子,使得代码更加清晰,更便于维护和测......
  • HDU-4281 Judges' response(2012 ACM/ICPC Asia Regional Tianjin Online)
    HDU-4281Judges'response(2012ACM/ICPCAsiaRegionalTianjinOnline)状态压缩+01背包+区间dp题意:有n个地点,第一个地点是裁判位置,其他n-1个地点是选手的位置。裁判要给选手解决问题,每个选手都有一个时间表示解决这个选手问题所需要的时间。同样的,裁判也有一个时间,表示这......
  • k8s集群搭建及对一些组件的简单理解(一)
    背景k8s的学习环境(用kubeadm方式搭建),我也搭过几次了,但都有点问题。要么在云服务器上弄,这个的问题是就只有一台轻量服务器,只能搭个单节点的;后来买了一台便宜的,所以就有了两台,但是不在一个zone,一个是广州,一个是成都,内网不通,感觉搭起来很麻烦,还没试过。要么是在本机的虚拟机上搞(vm......
  • 强化学习(Reinforcement Lrarning,RL)03:贝尔曼方程
    强化学习(ReinforcementLrarning,RL)03:贝尔曼方程强化学习(ReinforcementLrarning,RL)03:贝尔曼方程1.状态价值1.1状态价值函数(StateValueFunction)1.2最优策略(OptimalPolicy)2.贝尔曼方程2.1贝尔曼方程(BellmanEquation)2.2贝尔曼方程的推导2.3贝尔曼方程矩阵形式(Matr......