Vue组件 —— 单文件组件

news2025/1/16 21:46:32

追溯vue组件问题

        在未讲项目之前,在 这一篇内容当中就讲到了组件引入使用,有内置的组件和动态组件以及封装一个swiper组件,组件也分为全局组件和局部组件,在讲在项目当中去使用组件之前先简单的回顾一下组件的编写:

<div id="app">
    <hello></hello>
</div>
<script>
    // 组件 
    Vue.component("hello",{
        template:`
        <div>
            <button @click="handleHello">打招呼</button>    
        </div>
        `,
        methods:{
            handleHello(){
                alert("你好呀!");
            }
        }
    })

    new Vue({
        el:'#app'
    })
</script>

         在之前讲到 vue 组件的时候,将其封装成组件的时候很方便使用,但是在编写template模板的时候存在很多的问题,下面就将在前面未解决的问题在本篇内容当中来进一步的学习:

1. 组件起名称:js(script)中编写驼峰式,则html需要用连接符 -
2. 组件中编写DOM结构时:没有代码的高亮显示(解决:通过vue单文件组件解决)
3. 组件中编写DOM时用到css:只能写行内样式(解决:通过vue单文件组件解决)
4. template(模板):包含一个根节点(ps:将内容包裹起来)
5. 组件是孤岛,无法(直接)访问外边其他组件的状态或者方式(解决:间接的组件通信)
6. 自定义组件data必须是一个函数
7. 所有的组件写在同一个页面,代码很乱(解决:通过vue单文件组件解决)
 
补充:
    刚接触组件编写template模板中DOM结构会发现没有代码的提示,完全需要自己手敲,虽然用起来好用,但觉得不方便,这个在后面做项目的时候是通过vue单文件组件可以解决的,所以这些问题都在后续有其他的变化;
    使用组件可以进行引入使用,也使得组件像一座孤岛,那么组件与组件之间不能直接访问状态和方法,那么就需要通过组件与组件之间间接通信完成;
    可以回顾以上代码编写下来,script中编写的组件代码(Vue.component)内容还是蛮多的,如果还有其他的,那么这些代码和new Vue()中的代码混合会使整体代码很混乱,虽然解决了代码的耦合,但这些问题都能够得以解决;

        以上的这些问题就是先前我们编写组件的方式存在的问题,那么现在在项目当中,也是本篇目中最重要的内容就是Vue的单文件组件,接下来就是开始对Vue单文件组件内容的学习!

vue单文件组件

        通过简单的回顾了单文件组件的内容已经有了一个大概的了解,使用 Vue.components 来去定义组件,那么 vue单文件组件就是一个vue文件就是一个组件的形式,那么在存放组件的文件夹components中定义一个组件名为SayHello的组件;即 /components/SayHello.vue ;

<!-- SayHello组件 -->

<template>
    <div>
        <button @click="handleHello">打招呼</button>
    </div>
</template>

<script>
export default {
  methods: {
    handleHello () {
      alert('你好呀!')
    }
  }
}
</script>

        在使用的时候,只要将其引入在对应的 .vue 文件当中即可;在App.vue文件当中引入使用;

全局组件编写

<!-- App.vue -->

<template>
  <div id="app">
    <sHello></sHello>
  </div>
</template>

<script>
import hello from './components/SayHello.vue'
import Vue from 'vue'
// 全局注册
Vue.component('sHello', hello)

export default { }
</script>

局部组件编写

<template>
  <div id="app">
    <sHello></sHello>
  </div>
</template>

<script>
import hello from './components/SayHello.vue'

export default {
  // 局部注册
  components: {
    sHello
  }
}
</script>

        然后将项目进行运行起来,如是同上一篇来的可使用【npm run start】或【npm start】,如是自己创建的项目未修改则使用【npm run serve】运行;

        在浏览器中中访问地址 http://localhost:8080访问查看:可以看到刚刚编写的SayHello组件也可以正常使用成功了;

         可以知道我们刚在编写这个组件的时候同样是在template标签当中,同时该标签中仅能存在一个div,这个vue单文件组件解决了在之前通过Vue.components(...)中存在的一些问题,如template中代码的编写没有高亮提示,编写起来不方便等的一些问题。


样式冲突 —— scoped

        在之前的内容中还存在什么问题呢?template模板中的组件编写DOM时只能用内联的css样式,现在通过单文件组件可以解决这个问题,那么仍存在这样一个问题,组件的引入使用中CSS样式是否会发生冲突呢?下面来简单的测试一下:

  • 在App.vue文件中去编写按钮样式style :
<!-- App.vue -->
...
<style>
  button {
    background: yellow;
  }
</style>
<!-- SayHello -->
...
<style>
  button {
    background: green;
  }
</style>

        现在来测试运行之后,观察组件中的 <按钮> 是否会与App.vue中的组件样式发生冲突:

         在 <head> 标签中的 <style> 标签可以看到 button 样式 background 有 green 和 yellow 两种,那么仅有App.vue中的样式得以体现;如何解决呢?

1)通过添加id选择器;

        为 SayHello.vue template模板中div标签添加id选择器,在样式前添加选择器:

<template>
    <div id="lhxz-button">
        ...
    </div>
</template>
<script>...</script>
<style>
    #lhxz-button button{
        background: green;
    }
</style>

        现在可以看到的是可以通过选择添加id选择器的方式,那么接下来讲一种关于vue提高的另外一种解决方案;

2)scoped 

        可以不需要添加任何id选择,只需要在style标签种添加这样一个属性 —— scoped即可,添加这个属性后这这style的标签仅作用于当前这个组件;

<style scoped>
    ...
</style>

         以上就是本篇目的全部内容,了解之前组件引入使用中留下问题的解决之法,一个vue单文件就是一个组件,以及单文件组件所带来的样式冲突问题,vue也同样提供了这样一套解决方案,在style标签当中使用scoped属性;本期内容就到此结束,感谢大家的支持!一键三连哦!


单页面 / 多页面

单页面应用【SPA】多页面应用【MPA】
组成一个外壳页面和多个页面片段组成多个完整页面构成
资源(css/js)共用共用,只需要在外壳部分加载不共用,每个页面都需要加载
刷新方式局部刷新或更改全局刷新
url模式

xxx.com/#/one

xxx.com/#/two

xxx.com/one.html

xxx.com/two.html

用户体验切换快,用户体验好切换加载慢,流程度不够,体验差
转场动画容易实现无法实现
数据传递容易依赖url传参、或cookie/localStorage等
搜索引擎优化(SEO)需要单独方案,实现较为困难,不利于SEO检索,可利用服务器端渲染(SSR)优化实现方法简易
试用范围高要求的体验度、追求界面流程的应用适用于追求高度支持搜索引擎的应用
开发成本较高,常需借助专业的框架较低,但页面重复代码多
维护成本相对容易相对复杂

         为下一期关于路由 vue-router 相关的内容做基础!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

89.【SpringBoot-02】

SpringBoot聊一聊如何构建一个网站(十四)、.SpringBoot整合数据库操作1.整合JDBC(1).SpringData简介(2).整合JDBC(3).JdbcTemplate ⭐2. 整合Druid数据源 &#xff08;德鲁伊&#xff09;(1).Druid简介(2).配置数据源(3).配置Druid数据源监控(4).配置Druid数据源过滤器(5).注解…

Echarts的Y轴添加定值横线的示例

第010个点击查看专栏目录Echarts折线图的y轴要画一条横线&#xff0c;主要是在series中设置markLine的图表标线参数&#xff0c;具体的参考源代码。文章目录示例效果示例源代码&#xff08;共142行&#xff09;相关资料参考专栏介绍示例效果 示例源代码&#xff08;共142行&…

怎么在Windows电脑更新 DirectX ?

玩游戏的人应该都对DirectX不陌生&#xff0c;它可以提高游戏或多媒体程序的运行效率&#xff0c;增强3d图形和声音效果。但很多人都不知道DirectX该如何更新&#xff0c;这篇文章将以Win10为例&#xff0c;教大家怎么在电脑上更新DirectX。 一、检查当前DirectX版本 如果你不…

简单聊一聊组件封装

封装一个思维导图组件 最近封装了一个简单的思维导图组件&#xff0c;在此简单记录一下心里历程 组件样式 组件结构设计 节点之间的线分成三部分&#xff0c;分别是竖线左边的横线A、竖线B、竖线右边的横线C&#xff0c;所以一个节点可以包含以下几个元素&#xff1a; 横线…

VBA提高篇_18 VBA代码录制优化Select(tion)及表格合并Merge(cells()/Rows()/Columns()

文章目录1. Cells(1,1)2. Rows(Str)和Columns(Str)3. VBA合并单元格3.1 Range.MergeCells属性:3.2 Range.Merge/UnMerage属性:3.3 Range.Merge(参数True/False)3.4 操作合并/取消合并单元格的两种方法4. Select / Selection 和 录制宏的代码优化4.1 Select / Selection4.2 录制…

anconda的pip下载包出现的问题

问题一: 在anconda里面如何创建新的python环境(也就是更换新的python版本) 1.先打开anconda软件,创建需要的环境 2. 环境创建好之后,去pycharm里面进行配置解释器 3. 这样就可以用了 问题二:pip的安装软件时出现包找不到的问题? 注意:因为我们刚刚创建了一个python环境,等…

Python基于已知的分幅条带号筛选出对应遥感影像文件的方法

本文介绍基于Python语言&#xff0c;结合已知研究区域中所覆盖的全部遥感影像的分幅条带号&#xff0c;从大量的遥感影像文件中筛选落在这一研究区域中的遥感影像文件的方法。 首先&#xff0c;先来明确一下本文所需实现的需求。现已知一个研究区域&#xff08;四川省&#xff…

【C++】C++入门 函数重载

前言 自然语言中&#xff0c;一个词可以有多重含义&#xff0c;人们可以通过上下文来判断该词真实的含义&#xff0c;即该词被重载了。 函数重载一、函数重载定义二、函数重载的条件1. 参数类型不同2. 参数个数不同3. 参数类型顺序不同三、函数重载的原理--名字修饰(name Mangl…

怎么把网页变成灰色?怎么让头像或某一部分不变灰色?filter/backdrop-filter/mix-blend-mode/svg/grayscale(1)

在国家公祭日&#xff0c;我们哀悼沉思&#xff0c;势要勿忘国耻振兴中华&#xff1b;在国家重要人物逝世后&#xff0c;举国哀悼&#xff1b;这些时段很多网站都会积极呼应&#xff0c;给与自己的网页设置成灰色&#xff1b;那给网页设置成灰色是经过怎样的设置来实现的呢&…

利用pandas_udf加速机器学习任务

note pandas udf和python udf区别&#xff1a;前者向量化是在不同partition上处理pandas_udf使用panda API来处理分布式数据集&#xff0c;而toPandas()将分布式数据集转换为本地数据&#xff0c;然后使用pandas进行处理&#xff0c;如果Pyspark的dataframe非常大&#xff0c;…

快速排序和归并排序哪个快?

两个排序的基本思想都是分治&#xff08;分而治之&#xff09;,实现一般都使用递归实现。1.快速排序双边指针&#xff08;交换法&#xff09;&#xff1a;记录分界值 &#xff0c;创建左右指针&#xff08;记录下标&#xff09;。以第一个元素为分界值&#xff0c;先从右向左找…

C语言指针变量作为函数参数

在C语言中&#xff0c;函数的参数不仅可以是整数、小数、字符等具体的数据&#xff0c;还可以是指向它们的指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部&#xff0c;使得在函数内部可以操作函数外部的数据&#xff0c;并且这些数据不会随着函数的结束而被销毁…

ocelot的单节点解决方案

ocelot的问题前面我们解决了consul的单节点的集群扩建。这里讨论如果在多客户端访问时&#xff0c;单网关也会有瓶颈。如果单台挂掉&#xff0c;那么也会麻烦&#xff0c;所以根据项目需要解决问题。ocelot多节点部署最简单的粗暴解决&#xff0c;多部署几台网关。但是我们需要…

mac环境和windows环境下GeoServer如何安装部署

geoserver是从事GIS行业都应当了解的一个gis服务器。 所以说学会geoserver是一个非常必要的事情。那么这篇文章呢我就带着大家来一起学习如何在Mac机器上和windows机器上安装并部署Geoserver。 首先不管是哪个环境我们都需要去官网上先下载安装包。 第一步我们要去geoserver的…

【计算机组成原理】y = a * b + c 的执行具体流程

文章目录1.2.2 认识各个硬件部件1. 主存储器的基本组成2. 运算器的基本组成3. 控制器的基本组成4. 计算机的工作流程1.2.2 认识各个硬件部件 1. 主存储器的基本组成 存储体&#xff1a;存放数据和指令地址寄存器&#xff1a;用来存放读取存储体数据时存放的具体位置数据寄存器…

12、字符(串)输入、输出

目录 一、字符数据输入&#xff0f;输出 1. 字符数据输入 2. 字符数据输出 二、字符串输入&#xff0f;输出 1. 字符串输入函数 2. 字符串输出函数 一、字符数据输入&#xff0f;输出 1. 字符数据输入 字符数据输入使用的是getchar函数&#xff0c;其作用是从终端&…

前端遇到的问题

inputs-outputs https://angular.cn/guide/inputs-outputs 用于父组件与子组件间的值传递 在项目中引入核心组件 父组件在其html界面绑定属性 在子组件里通过Input传递值 具体里: 使用默认规则数组绑定固定值(比如id)的错误 这里两个ts文件之间传值,采用了一个get函数,…

微信小程序 view组件的基本使用

1.view基本理论 能看图就尽量减少文字提示&#xff0c;从图书可以看出ABC是纵向排列的。 为什么会纵向排列而不是横向排列&#xff0c;那是因为view是块元素&#xff0c;能占满整一行。 怎么让view块元素横向并排呢&#xff1f; 向上图一样横向排列&#xff0c;接下来教学从0…

Kerberos协议与认证数据包分析

Kerberos协议 Kerberos是一种在开放的非安全网络中认证并识别用户身份信息的方法, 它旨使用密钥加密技术为客户端/服务端应用程序提供强身份认证。 目前主流的Kerberos版本是2005年的RFC4120标准的Kerberos v5, Windows、Linux和MacOs均支持Kerberos协议。Kerberos基础 Kerbe…

Quartz入门看这一篇文章就够了

第一章 Quartz简介 第一节 Quartz是什么? 1Quartz [kwɔːts]是一个完全由Java编写的开源的作业调度框架第二节 Quartz可以用来做什么? 比如说买火车票下单之30分钟之后,查看是否付款付款完成之后,在乘车日期的时候是否乘车或者每个月1号扣房贷每个月20号自动还信用卡想定时…