Vue 组件分类、局部注册和全局注册

文章目录

        • 背景知识
        • 组件分类
        • 安装 vue-cli
        • 示例
          • 设置组件局部注册
          • 设置组件全局注册

背景知识

开发 Vue 的两种方式:

  1. 核心包传统开发模式:基于 html / css / js 文件,直接引入核心包,开发 Vue。
  2. 工程化开发模式:基于构建工具(例如:webpack ) 的环境中开发 Vue。

一个页面可以拆分成一个个组件,每个组件有着自己独立的结构(html部分)、样式(css部分)、行为(javascript)。好处是便于维护,利于复用。

组件分类

组件分为根组件与普通组件。
在这里插入图片描述

App.vue 为根组件,包含结构、样式、行为3部分。结构通过 <template> 标签提供,样式通过 <style> 标签提供,行为通过 <script> 标签提供。结构部分有且只能有 1 个根元素。
当使用构建步骤时,我们一般会将 Vue 组件定义在一个单独的 .vue 文件中,这被叫做单文件组件 (简称 SFC)。
无论是局部注册还是全局注册,应用时当成 html 标签即可,格式为:

<组件名></组件名>

组件名命名需要遵守大驼峰命名法,如 componentName。
技巧:一般都用局部注册,如果发现确实是通用组件,再抽离到全局。

安装 vue-cli

vue-cli 是 Vue 官方提供的一个全局命令工具。可以帮助我们快速创建一个开发 Vue 项目的标准化基础架子,其内部集成了 webpack 配置。

vue-cli 使用步骤:

  1. 全局安装 (一次) : npm i @vue/cli -g
  2. 查看 Vue 版本:vue --version
  3. 创建项目架子:vue create project-name(项目名-不能用中文)
  4. 启动项目: npm run serve(找package.json)

在这里插入图片描述

示例

我们把之前的watch案例拆分成组件格式。原 html 文件为:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        font-size: 18px;
      }
      #app {
        padding: 10px 20px;
      }
      .box {
        display: flex;
      }
      textarea {
        width: 300px;
        height: 160px;
        font-size: 18px;
        border: 1px solid #dedede;
        outline: none;
        resize: none;
        padding: 10px;
      }
      textarea:hover {
        border: 1px solid #1589f5;
      }
      .tip-box span {
        flex: 1;
        text-align: center;
      }
      .query span {
        font-size: 18px;
      }

      .input-wrap {
        position: relative;
      }
      .input-wrap span {
        position: absolute;
        right: 15px;
        bottom: 15px;
        font-size: 12px;
      }
      .input-wrap i {
        font-size: 20px;
        font-style: normal;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <div class="box">
        <div class="input-wrap">
          <textarea v-model="words.cat"></textarea>
        </div>
      </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>
      
      const app = new Vue({
        el: '#app',
        data: {
          words: {
            cat : '奶牛猫',
            dog : '哈士奇',
          }
        },
        watch: {
          'words.cat' : {
            deep : true,
            immediate : true,
            handler (newvalue) {
              console.log(newvalue)
            }
          }
        }
      })
    </script>
  </body>
</html>

执行 vue create vue-test1,生成 vue-test1 项目,在 components 目录下创建 cat.vue 和 dog.vue 单文件组件。我们准备将 cat.vue 设置为局部注册的组件,dog.vue 设置为全局注册的组件。整个项目的结构如下图:
在这里插入图片描述

设置组件局部注册

cat.vue 的内容如下,需要注意原 html 文件的 data 对象变成了现在的 data 函数。

<template>
  <div class="box">
    <div class="input-wrap">
      <textarea v-model="words.cat"></textarea>
    </div>
  </div>
</template>

<script>
export default {
  name: "cat",
  data() {
    return {
      words: {
        cat: '奶牛猫',
        dog: '哈士奇',
      }
    }
  },
  watch: {
    'words.cat': {
      deep: true,
      immediate: true,
      handler(newvalue) {
        console.log(newvalue)
      }
    }
  }
}
</script>

<style scoped>
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font-size: 18px;
}

#app {
  padding: 10px 20px;
}

.box {
  display: flex;
}

textarea {
  width: 300px;
  height: 160px;
  font-size: 18px;
  border: 1px solid #dedede;
  outline: none;
  resize: none;
  padding: 10px;
}

textarea:hover {
  border: 1px solid #1589f5;
}

.tip-box span {
  flex: 1;
  text-align: center;
}

.query span {
  font-size: 18px;
}

.input-wrap {
  position: relative;
}

.input-wrap span {
  position: absolute;
  right: 15px;
  bottom: 15px;
  font-size: 12px;
}

.input-wrap i {
  font-size: 20px;
  font-style: normal;
}
</style>

在根组件 App.vue 中使用 import 语句引入 cat 组件,然后在 components 模块注册组件,最后在 template 结构中应用组件,整个过程就是一个完整的局部注册。 App.vue 内容为:

<template>
  <div id="app">
    <cat></cat>
    <dog></dog>
  </div>
</template>

<script>
import cat from '@/components/cat.vue'

export default {
  name: 'App',
  components: {
    cat
  }
}
</script>

<style>

</style>

局部注册意味着只能在注册的组件内使用该组件,而全局注册意味着可以在所有组件内使用。

设置组件全局注册

设置组件全局注册,需要首先创建 .vue 文件,然后在 main.js 中进行全局注册。dog.vue 内容为:

<template>
  <h3>哈士奇</h3>
</template>

<script>
export default {
  name: "dog"
}
</script>

<style scoped>
</style>

在 main.js 中,首先使用 import 语句导入需要全局注册的组件,然后再调用 Vue.component 进行全局注册。注册之后,就可以在其他组件使用 dog 组件了,本例中,我们在 App.vue 中引入了 dog 组件。main.js 的内容为:

import {createApp} from 'vue'
import App from './App.vue'


import dog from '@/components/dog.vue'

const app = createApp(App)


app.component('dog', dog)
app.mount('#app')

在 vue-test1 项目目录下,执行 npm run serve 语句,项目运行:
在这里插入图片描述
打开 localhost:8080,显示
在这里插入图片描述
经过简单输入测试,与原 html 的功能一致。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/578850.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[c++]菱形继承解析

菱形继承 大概示意图&#xff1a; 菱形继承不一定只是标准的菱形&#xff0c;只要形似菱形的都可以叫菱形继承。 (以下说明都是默认公有继承&#xff0c;public和protected成员情况下) 菱形继承会造成数据的冗余和二义性&#xff1a; 冗余&#xff1a;一个Assitant对象里面有…

[C++基础学习]----03-程序流程结构之循环结构详解

前言 在C程序中&#xff0c;循环结构在用于重复执行一段代码块&#xff0c;直到满足某个条件为止。循环结构有多种形式&#xff0c;包括while循环、do-while循环和for循环。 正文 01-循环结构简介 1、while循环语句&#xff1a; while循环在每次循环开始前检查条件是否为真&a…

数据库锁介绍

数据库锁是一种同步机制&#xff0c;用于控制多个事务对共享资源的访问&#xff0c;防止并发操作造成的数据不一致。在数据库中&#xff0c;锁通常分为两种基本类型&#xff1a;排他锁&#xff08;Exclusive Locks&#xff09;和共享锁&#xff08;Shared Locks&#xff09;。排…

大型语言模型高效推理综述

论文地址&#xff1a;2404.14294.pdf (arxiv.org) 大型语言模型&#xff08;LLMs&#xff09;由于在各种任务中的卓越表现而受到广泛关注。然而&#xff0c;LLM推理的大量计算和内存需求给资源受限的部署场景带来了挑战。该领域的努力已经朝着开发旨在提高LLM推理效率的技术方…

【C++】namespace、class、struct的区别

文章目录 命名空间定义命名空间using指令不连续的命名空间嵌套的命名空间多文件编程时的命名空间命名空间只能全局范围内定义命名空间中的函数 可以在“命名空间”外 定义无名命名空间,意味着命名空间中的标识符只能在本文件内访问,相当于给这个标识符加上了static,使得其可…

【Hadoop】-Apache Hive使用语法与概念原理[15]

一、数据库操作 创建数据库 create database if not exists myhive; 使用数据库 use myhive; 查看数据库详细信息 desc database myhive; 数据库本质上就是在HDFS之上的文件夹。 默认数据库的存放路径是HDFS的&#xff1a;/user/hive/warehouse内 创建数据库并指定hdfs…

redis7 for windows的安装教程

本篇博客主要介绍redis7的windows版本下的安装教程 1.redis介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的&#xff0c;基于内存的数据结构存储系统&#xff0c;可用作数据库、缓存和消息代理。它支持多种数据结构&#xff0c;如字符串、哈希表、列…

PCIe debug设计:锁存ltssm 状态机

图1&#xff1a;debug设计添加位置 图2&#xff1a;ltssm状态切换图 LTSSM state: LTSSM state encoding: • 00h: detect.quiet • 01h: detect.active • 02h: polling.active • 03h: polling.compliance • 04h: polling.configuration • 05h: config.linkwidthstart • 0…

鸿蒙内核源码分析(时钟任务篇)

时钟概念 时间是非常重要的概念&#xff0c;我们整个学生阶段有个东西很重要,就是校园铃声. 它控制着上课,下课,吃饭,睡觉的节奏.没有它学校的管理就乱套了,老师拖课想拖多久就多久,那可不行,下课铃声一响就是在告诉老师时间到了,该停止了让学生HAPPY去了. 操作系统也一样&…

linux进程通信 ipc

进程通信 管道 父子进程创建命令 实现ls | wc -l 左边写端 &#xff0c;右边读端 父进程写 子进程读 int fd[2]; pipe(fd); fd[1] 是写 fd[0]是读 读之前关闭写 写之前关闭读 兄弟进程创建命令 无法进行管道通信可能是父进程也把握了读端和写端 可能会流入到父进程…

抓包理解协议

用的Wireshark 抓包 1.抓包网卡选择 - WLAN 无线网卡&#xff0c;其他是本地虚拟机的网卡 这里分别是开始捕获、停止捕获、重新捕获、网卡选择&#xff0c;下面是可以过滤选择 过滤tcp包 3次握手&#xff1a; source是源地址&#xff0c; destination是目标地址&#xff0c;in…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-5

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

嵌入式学习58-ARM7(字符设备驱动框架led)

知识零碎&#xff1a; kernel 内核 printk 内核打印 cat /proc/devices insmod …

VMWARE安装xpsp3时无法从光盘启动安装显示dhcp转圈圈

VMWARE安装xpsp3时无法从光盘启动安装显示dhcp转圈圈。之前都安装过无数次了。这次被卡住了。 原来是这里原因 不成功是因为启动时连接没打钩。默认是打钩的。不知道怎么的我把勾去掉了。我还跑去设置bios。都没有用。

开放地址法解决哈希冲突

1.基本思想: 有冲突时就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将元素存入. 2.开放地址法的常用方法: (1) 线性探测法: Hi(Hash(key)di)%m (1<i<m),其中:m为哈希表长度,di为增量序列1,2,……m-1,且dii;其实就是一旦有冲突,就找下一个空地…

【Spring MVC】_SpringMVC项目返回静态页面

目录 1. 创建与设计前端页面 2. 返回HTML静态页面 2.1 示例1&#xff1a;使用RestController 2.2 示例2&#xff1a;使用Controller 3. RestController与Controller 在本专栏关于SpringMVC项目的相关文章中&#xff0c;已经介绍了操作HTTP请求的方式&#xff0c;包括多种传…

CTFHub Web 信息泄漏(一)

目录遍历 打开题目 点击开始寻找flag 发现在flag_in_here页面中有四个文件夹 点击打开第一个文件夹 发现里面还有四个文件夹 再次点击打开第一个文件夹 里面什么都没有 尝试对所有文件夹依次都点击打开 在2/4中发现flag.txt 点击打开即可得到flag 不太懂这题的难点&#…

[RocketMq:基于容器化]:快速部署安装

文章目录 一&#xff1a;相关镜像准备&#xff1a;RocketNameServer1.1&#xff1a;查看相关镜像和版本1.2&#xff1a;拉取镜像1.3&#xff1a;配置和运行RocketNameServer容器 二&#xff1a;相关镜像准备&#xff1a;RocketBroker2.1&#xff1a;创建配置目录和broker配置文…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(一)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 1 - 2节&#xff09; P1《课程介绍》 开场白&#xff0c;HarmonyOS 的一个简介&#xff0c;话不多说&#xff0c;直接看图吧&…

【算法一则】【贪心】数组中的数可以拼装成的最大数

题目 给定一组非负整数 nums&#xff0c;重新排列每个数的顺序&#xff08;每个数不可拆分&#xff09;使之组成一个最大的整数。 注意&#xff1a;输出结果可能非常大&#xff0c;所以你需要返回一个字符串而不是整数。 示例 1&#xff1a; 输入&#xff1a;nums [10,2] …
最新文章