首页 > 其他分享 >vue3学习基础之组件

vue3学习基础之组件

时间:2023-12-26 16:01:22浏览次数:40  
标签:count vue const .. 学习 only vue3 组件

组件

Comp.vue

<script setup>
import { ref, provide, readonly, defineAsyncComponent } from "vue";
import DemoComp from "../../components/simple/DemoComp.vue";
import ErrorComponent from "../../components/simple/ErrorComp.vue";
import LoadingComponent from "../../components/simple/LoadingComp.vue";

const count = ref(5);
const isActive = ref(true);
const postFontSize = ref(1);
const dynamicSlotName = "slot4";

// 组件后代提供数据,避免“prop 逐级透传”
provide("module_name", "ad");
const location = ref("North Pole");

function updateLocation() {
  location.value = "South Pole";
}

//允许组件后代修改数据
provide("location", {
  location,
  updateLocation,
});
//不允许组件后代修改数据
provide("read_only_count", readonly(count));

//异步组件
const HelloComp = defineAsyncComponent(() => import("../../components/simple/HelloComp.vue")); //简单用法
// 定义一个耗时执行的函数,t 表示延迟的时间, callback 表示需要执行的函数,可选
const time = (t, callback = () => { }) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      callback();
      resolve();
    }, t);
  });
};
const Hello = defineAsyncComponent({
  // 加载函数
  loader: () => {
    return new Promise((resolve, reject) => {
      (async function () {
        await time(2000);
        const res = await import("../../components/simple/HelloComp.vue");
        resolve(res);
      })();
    });
  },
  loadingComponent: LoadingComponent, // 加载异步组件时使用的组件
  delay: 1000, // 展示加载组件前的延迟时间,默认为 200ms
  errorComponent: ErrorComponent, // 加载失败后展示的组件
  timeout: 3000,
});
</script>

<template>
  <div>
    <div :style="{ fontSize: postFontSize + 'rem' }">
      <el-row :gutter="5">
        <el-col :span="12">
          <el-card class="box-card">
            <template #header>
              <div class="card-header">
                <span>组件</span>
              </div>
            </template>
            <demo-comp :class="{ active: isActive }" title="Vue3" greeting-message="hi" :likes="42" :is-published="false"
              :comments="[
                { id: 234, content: 'ok' },
                { id: 266, content: 'nice' },
                { id: 273, content: 'not good' },
              ]" :author="{ name: 'Veronica', company: 'Veridian Dynamics' }"
              @enlarge-text="postFontSize += 0.1">渲染default slot

              <template #slot2>
                <span>渲染slot2</span>
              </template>
              <template v-slot:slot3>
                <span>渲染slot3</span>
              </template>
              <template v-slot:[dynamicSlotName]>
                <span>渲染slot4</span>
              </template>
              <!-- 作用域插槽,父组件接收子组件传过来的值itemProps,父组件可以根据子组件传过来的值决定插槽的内容 -->
              <template #item="itemProps">
                {{ itemProps.id + "|" + itemProps.content }}
              </template>
            </demo-comp>
          </el-card>
        </el-col>
        <el-col :span="12">
          <el-card class="box-card">
            <template #header>
              <div class="card-header">
                <span>组件</span>
              </div>
            </template>
            <demo-comp :class="{ active: isActive }" title="test" greeting-message="test" :likes="30" :is-published="true"
              :comments="[
                { id: 234, label: 'ok', num: 10 },
                { id: 266, label: 'nice', num: 5 },
                { id: 273, label: 'not good', num: 18 },
              ]" :author="{ name: 'Veronica', company: 'Veridian Dynamics' }" @enlarge-text="postFontSize += 0.1">
              <!-- 作用域插槽,父组件接收子组件传过来的值itemProps,父组件可以根据子组件传过来的值决定插槽的内容 -->
              <template #item="itemProps">
                {{ itemProps.id + "|" + itemProps.label + "|" + itemProps.num }}
              </template>
            </demo-comp>
          </el-card>
        </el-col>
      </el-row>
    </div>

    <div>
      <p>异步组件</p>
      <hello-comp></hello-comp>
      <p>延时3s渲染</p>
      <hello></hello>
    </div>
  </div>
</template>

<style scoped>
span {
  margin-left: 1rem;
}
</style>

 DemoComp.vue

<script setup>
import { ref, inject } from "vue";

defineOptions({
  inheritAttrs: false, //禁用 Attributes 继承
});

const props = defineProps({
  title: String,
  greetingMessage: String,
  likes: Number,
  isPublished: Boolean,
  author: Object,
  comments: Array,
});
const emits = defineEmits(["enlargeText"]);

const count = ref(0);

// 注入上层组件提供的数据
const api_url = inject("api_url");
const module_name = inject("module_name");
const { location, updateLocation } = inject("location");
let read_only_count = inject("read_only_count");

function updateCount() {
  read_only_count.value++;
  alert("read_only_count的值为:" + read_only_count.value);
}
</script>

<template>
  <div>
    <p :class="$attrs.class">
      <span>msg:{{ title }}</span>
      <span>greetingMessage:{{ greetingMessage }}</span>
      <span>likes:{{ likes }}</span>
      <span>is-published:{{ isPublished ? "是" : "否" }}</span>
      <span>author:{{ author.name + "|" + author.company }}</span>
    </p>
    <button type="button" @click="count++">count is {{ count }}</button>
    <button @click="$emit('enlargeText')">Enlarge text</button>
    <p>
      <slot><span>default slot </span></slot>
      <slot name="slot2"><span>slot2</span></slot>
      <slot name="slot3"><span>slot3</span></slot>
      <slot name="slot4">
        <span>slot4</span>
      </slot>
    </p>

    <!-- 作用域插槽,子组件传值item给父组件 -->
    <p>
      comments:
      <span v-for="(item, index) in comments" :key="index">
        <slot name="item" v-bind="item"></slot>
      </span>
    </p>

    <p>
      App.vue注入:
      <span>{{ api_url }}</span>
    </p>
    <p>
      父级组件注入(允许修改):
      <span>{{ module_name }}</span>
      <button @click="updateLocation">{{ location }}</button>
    </p>
    <p>
      父级组件注入(不允许修改):
      <span>{{ read_only_count }}</span>
      <button @click="updateCount">update count</button>
    </p>
  </div>
</template>

<style scoped>
span {
  margin-left: 1rem;
}

button,
a {
  border: 1px solid blue;
  margin-left: 1rem;
}
</style>

 

标签:count,vue,const,..,学习,only,vue3,组件
From: https://www.cnblogs.com/caroline2016/p/17928314.html

相关文章

  • Spring学习记录之Spring对IoC的实现
    Spring学习记录之Spring对IoC的实现前言这篇文章是我第二次学习b站老杜的spring相关课程所进行的学习记录,算是对课程内容及笔记的二次整理,以自己的理解方式进行二次记录,其中理解可能存在错误,欢迎且接受各位大佬们的批评指正;关于本笔记,只是我对于相关知识遗忘时快速查阅了解使......
  • FPGA学习笔记---verilog学习(2)--过程块always@(*)
    在Verilog中always@(*)语句的意思是always模块中的任何一个输入信号或电平发生变化时,该语句下方的模块将被执行。1、always语句有两种触发方式。第一种是电平触发,例如always@(aorborc),a、b、c均为变量,当其中一个发生变化时,下方的语句将被执行。2、第二种是沿触发,例如always......
  • C++ Qt开发:QSqlDatabase数据库组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QSqlDatabase数据库模块的常用方法及灵活运用。QtSQL模块是Qt框架的一部分,它提供了一组类和函数......
  • vue3学习基础之响应式状态
    响应式状态<scriptsetup>import{ref,reactive,computed,watch,watchEffect}from"vue";//reactive响应式对象只能用于对象、数组和集合类型constauthor=reactive({name:"JohnDoe",books:["Vue2-AdvancedGuide","Vue3-......
  • 深度学习:人工智能的前沿探索
    人工智能(ArtificialIntelligence,简称AI)是近年来科技领域最为引人注目的发展方向之一。在AI的众多技术中,深度学习(DeepLearning)无疑是最为引人瞩目和取得重大突破的领域之一。深度学习是一种模拟人脑神经网络结构和功能的机器学习方法,通过多层次的神经网络对数据进行学习和分析,以实......
  • 测试开发 | 深度学习的引擎:神经网络结构探析
    在人工智能领域中,深度学习的崛起被认为是推动技术革命的重要引擎之一。而深度学习的核心,则是建立在强大而灵活的神经网络结构之上。本文将深入探讨神经网络结构的关键组成部分,揭示其背后的原理和功能。神经网络的基本构成神经网络是深度学习的基石,其基本构成包括输入层、隐藏层和输......
  • 机器学习新手如何应对数据集不平衡的情况?
    1、增加少数类别的样本数量,可以通过复制样本或使用SMOTE(SyntheticMinorityOver-samplingTechnique)等技术生成新的样本2、减少多数类别的样本数量,可以通过随机删除样本或使用CV(Cross-Validation)等技术3、使用专门处理不平衡数据的算法4、使用集成学习方法,如Bagging、Boosting等......
  • vue3学习基础之事件绑定
    事件绑定<scriptsetup>import{nextTick,ref}from"vue";functionclickA(){console.log("点击了a标签,点击事件传递到了外层p标签");}functionclickStop(){console.log("点击了a标签,点击事件停止向外层传递");}functionclickOnce(){console.log......
  • vue3学习基础之表单相关
    表单相关<scriptsetup>import{ref}from"vue";constmessage=ref("hello");constchecked=ref();constcheckedNames=ref([]);constpicked=ref();constselected=ref();constmulSelected=ref([]);constnum=ref(5);......
  • vue3学习基础之vue-router
    我的vue3学习之路总是学学停停,最开始在18年开发微信小程序,就发现小程序和vue的语法有些相似,然后就去看了vue2的文档,随后忙其它的事情就丢下了。直到22年又开始捡起来vue3,有了组合式api,语法简明很多,然后又不知道忙什么丢下。。。前段有些空时间,就把vue3的学习整理下,使用vite构建......