Vue2:脚手架 vue-cli

Vue2:脚手架 vue-cli

    • 结构
    • render
    • ref
    • props
    • mixin
    • scoped


脚手架是Vue官方提供的Vue开发平台,.vue文件就需要通过脚手架来解析,所以对于单文件组件就依赖于脚手架。

安装:

npm i -g @vue/cli

如果执行vue --version有输出,那么说明脚手架安装成功了。

基于脚手架,可以快速创建一个项目的基本结构,命令如下:

vue create 项目名

创建一个名为study的项目:

在这里插入图片描述

此时会询问,要使用哪一个Vue版本,目前使用Vue2

出现以下界面,说明脚手架创建成功:

在这里插入图片描述

进入项目目录,执行:

npm run serve

此时基于现有的.vue文件,启动一个本地服务,随后就可以通过本地服务访问页面:

在这里插入图片描述

访问127.0.0.1:8080

在这里插入图片描述

此时Vue脚手架就已经开始运行了,这个页面是创建脚手架时Vue自动创建的一个hello界面。


结构

脚手架初始的文件结构如下:

├── node_modules 
├── public
│   ├── favicon.ico: 页签图标
│   └── index.html: 主页面
├── src
│   ├── assets: 存放静态资源
│   │   └── logo.png
│   │── component: 存放组件
│   │   └── HelloWorld.vue
│   │── App.vue: 汇总所有组件
│   │── main.js: 入口文件
├── .gitignore: git版本管制忽略的配置
├── babel.config.js: babel的配置文件
├── package.json: 应用包配置文件 
├── README.md: 应用描述文件
├── package-lock.json:包版本控制文件
  1. public/index.html:主页文件,引入src/main.js作为入口
  2. src/main.js:定义了最大的vm对象,引入App.vue管理App组件
  3. src/App.vue:最大的组件,所有的组件都在该组件之下统一管理
  4. src/component/:该目录下是所有的组件

简单来说,所有的组件都定义在src/component/目录下,并被App.vue统一管理,最后经过src/main.js引入到public/index.html主页中,这样就构成了一个页面。

程序员的绝大部分操作,都在src/component/目录中。


render

打开main.js,内容如下:

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

刚才提到,main.js负责引入App.vue但是这一块的语法非常奇怪,使用了一个render方法。

正常来说,引入App.vue应该这样写:

new Vue({
  el:'#app',
  template: `<App></App>`,
  components: {App}
})

通过components引入App组件,再通过template模板解析<App>标签,但是这样是错误的。

因为vue-cli默认引入的是一个简化版本的vue,这个版本没有模板解析器,在vm中没有template选项,所以以上代码无法运行。

render方法可以向网页中添加一个DOM节点:

new Vue({
  el:'#app',
  render(createElement){
  	return createElement('标签', '内容')
	}
})

render接收一个参数createElement,该参数是一个函数,函数的第一个参数传入标签名,第二个参数传入内容。这样就可以在网页中渲染出一个DOM节点,比如创建一个<h1> hello </h1>

new Vue({
  el:'#app',
  render(createElement){
  	return createElement('h1', 'hello')
	}
})

由于最后要使用App标签,由不能通过模板解析器,此时就可以借助于render

render(createElement){
 	return createElement(App)
}

App中无需传入内容,所以createElement就没有第二个参数。以上写法可以进行简化:

// 简化参数名称
render(h){
 	return h(App)
}

// 变为箭头函数
render: h => h(App)

这样就变为了main.js中的形态,最后把el: '#app'改为$mount的形式,就得到:

new Vue({
  render: h => h(App),
}).$mount('#app')

ref

ref是一个标签属性,其可以快速拿到一个标签的DOM对象,如果标签是组件,那么可以得到该组件的实例对象。

当前App.vue结构如下:

<template>
  <div id="app">
    <h2>一个标题</h2>
    <HelloWorld/>
  </div>
</template>

其包含一个标题h2和一个组件HelloWorld,对这两个标签添加ref属性:

<template>
  <div id="app">
    <h2 ref="title">一个标题</h2>
    <HelloWorld ref="hello" />
    <button @click="testRef"></button>
  </div>
</template>

最后在methods中添加一个testRef方法,输出当前的vm

export default {
  name: 'App',
  components: {
    HelloWorld
  },
  methods:{
    testRef(){
      console.log(this)
    }
  }
}

点击按钮输出结果:

在这里插入图片描述

vm下,多出一个$ref属性,该属性有hellotitle两个子属性,其中helloVueComponent对象,也就是一个组件的实例,而title<h2>标签的DOM对象。

基于ref方法,可以快速的获取到指定标签的DOM对象或者vc对象,这在组件间通信时有很大的用处。

console.log(this.$refs.title)
console.log(this.$refs.hello)

输出结果:

在这里插入图片描述


props

props可以让组件接收外部传入的数据。

现有一个StudentInfo组件,结构如下:

<template>
    <div>
        <h2>学生信息:</h2>
        <p>姓名:</p>
        <p>年龄:</p>
        <p>性别:</p>
    </div>
</template>

App.vue中引入该组件,那么如何才能让StudentInfo组件输出不同的学生信息?这就需要使用props属性了。

语法:

{
    props:['属性1','属性2',...]
}

在配置项中,peops配置项可以接收来自外部的参数,将要接受的属性名以数组形式写在props中。

修改StudentInfo.vue

<template>
    <div>
        <h2>学生信息:</h2>
        <p>姓名:{{ name }}</p>
        <p>年龄:{{ age }}</p>
        <p>性别:{{ sex }}</p>
    </div>
</template>

<script>
export default {
    name: 'StudentInfo',
    props:['name', 'age', 'sex']
}
</script>

App.vue中,只需要使用组件标签时,把参数以属性的形式传入即可:

<template>
  <div id="app">
    <StudentInfo name="张三" age="18" sex="男"/>
    <StudentInfo name="翠花" age="22" sex="女"/>
  </div>
</template>

输出结果:

在这里插入图片描述

这样同一个组件就可以接收父组件的参数,承载不同的信息了。

props还有更加详细的传参方式:

props:{
     name: String,
     age: Number,
     sex: String
 }

props定义为对象,组件接收的每个参数可以指定接收类型,这样可以完成对数据类型的限制。

默认情况下,属性传入的都是字符串:

<StudentInfo name="张三" age="18" sex=""/>

以上传入的三个参数都是字符串,包括18也是字符串。如果传参时希望解析内容,而不是字符串,就需要通过:单向绑定,这样会把""内部的内容作为表达式解析。其中age要以数字的形式传入,所以加上:修饰。

<StudentInfo name="张三" :age="18" sex=""/>

StudentInfo组件中,输出age+1

<template>
    <div>
        <h2>学生信息:</h2>
        <p>姓名:{{ name }}</p>
        <p>年龄:{{ age + 1 }}</p>
        <p>性别:{{ sex }}</p>
    </div>
</template>

输出结果:

在这里插入图片描述

加法正常执行了,说明传入的18成功解析为了字符串。

此处可以得到两个要点:

  1. 传参时如果数据类型不是字符串,要加上:修饰,将内容作为表达式解析
  2. 接收方可以在props内部限定传入数据的类型

props还有更详细的写法:

props{
	'属性':{
		type:Number,
		required:false,
		default:20
	}
}
  • type:限定该属性的类型
  • required:该属性是否可以缺省
  • default:如果不传参,该属性的缺省值

如果外界没有传入某个属性,并且这个属性没有缺省值,那么默认为undefined


mixin

现有StudentInfoTeacherInfo两个组件,如下:

  • TeacherInfo
export default {
    name: 'TeacherInfo',
    data(){
        return {
            name: '李老师',
            classRoom: "三班 四班"
        }
    },
    methods:{
        getName() {
            console.log(this.name)
        }
    }
}
  • StudentInfo
export default {
    name: 'StudentInfo',
    data(){
        return {
            name: '张三',
            age: 18,
            sex: '男'
        }
    },
    methods:{
        getName() {
            console.log(this.name)
        }
    }
}

在这两个组件中,有一个getName方法都是一样的,那么mixin就可以处理这样的多个组件之间,存在相同属性或方法的复用问题。

.js文件内部的属性和方法,可以通过mixin添加到多个组件中,这样多个组件就可以复用相同的属性和方法。

  • test.js
export const test = {
    methods:{
        getName() {
            console.log(this.name)
        }
    }
}

test.js中,把getName方法定义到一个对象下,并把对象暴露出去。

接下来就可以在组件中引入这个test.js,并通过mixin使用test.js内的方法:

import {test} from '../test.js'

export default {
    name: 'TeacherInfo',
    data(){
        return {
            name: '李老师',
            classRoom: "三班 四班"
        }
    },
    mixins:[test]
}

通过mixin引入,需要通过mixins配置项,值为一个数组,数组内部是要导入的对象。

随后在TeacherInfo中就可以使用test.js内部的方法了,StudentInfo同理。

除此之外,mixin引入的.js文件中,还可以定义data数据、hook生命周期钩子等等内容:

export const test = {
    data(){
        return {
            a: 1,
            b: 2
        }
    },
    methods:{
        getName() {
            console.log(this.name)
        }
    },
    mounted(){
        console.log("挂载完成")
    }
}

任何通过mixin引入这个test的组件,都会获得test内部的所有内容,这样就可以把不同组件内部相同的内容,通过mixin进行复用。


scoped

依然沿用之前的TeacherInfoStudentInfo结构,但是分别为它们添加背景色的样式:

  • TeacherInfo
<style>
    p{
        background-color: pink;
    }
</style>
  • StudentInfo
<style>
    p{
        background-color: skyblue;
    }
</style>

两个组件分别使用的了不同的背景色,都作用于<p>标签,输出结果:

在这里插入图片描述

输出时,它们都变成了粉色,可是学生信息明明是skyblue,为什么变成了粉色?

这是因为在.vue进行汇总时,会把所有组件的<style>都放到一起,导致<p>标签的样式之间发生了覆盖。

App.vue中引入组件:

import StudentInfo from './components/StudentInfo.vue'
import TeacherInfo from './components/TeacherInfo.vue'

TeacherInfo是后引入的,所以会覆盖掉StudentInfo<p>样式,导致学生样式输出错误。

如果要解决这个问题,就需要scoped属性,其可以限定<style>内部的样式,只作用于当前的组件,不会影响其它的组件。

语法:

<style scoped>
<style>

现在给两个组件的<style>都加上这个属性:

在这里插入图片描述

css样式分别独立了,大部分情况下,为了避免组件之间样式相互影响,都会启用这个属性。


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

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

相关文章

【MYSQL】主从复制机制(图解)

一、什么是主从复制 主从复制是一种通过binlog&#xff08;二进制日志&#xff09;进行操作的一直复制机制&#xff0c;它会有一个主数据库&#xff0c;还会有一个从数据库&#xff0c;根据binlog就可以把主数据库中的信息复制到从数据库之中。这个主从复制的好处就是如果在并发…

SpringCloud Gateway网关路由配置 接口统一 登录验证 权限校验 路由属性

介绍 Spring Cloud Gateway 根据请求的路径、HTTP 方法、头部等信息&#xff0c;将请求路由到对应的微服务实例。它支持基于动态路由规则的配置&#xff0c;可以根据请求的 URL、查询参数、请求头等条件&#xff0c;灵活地决定将请求转发到哪个微服务。Spring Cloud Gateway 提…

Java学习Day60:回家!(ElasticStatic)

1.what is ElasticStatic The Elastic Stack, 包括 Elasticsearch、 Kibana、 Beats 和 Logstash&#xff08;也称为 ELK Stack&#xff09;。能够安全可靠地获取任何来源、任何格式的数据&#xff0c;然后实时地对数据进行搜索、分析和可视化。 Elaticsearch&#xff0c;简称…

《进制转换:数字世界的奇妙变身术》

思维导图 一、什么是进制转换 在当今数字化飞速发展的时代&#xff0c;数字如同构建整个数字宇宙的基本粒子&#xff0c;无处不在且发挥着至关重要的作用。而在这个数字的魔法世界里&#xff0c;进制就像是不同的语言规则&#xff0c;每种进制都有着独特的构建方式和逻辑。 我…

Unity3D高级编程

1、标签(Tag)和图层(Layer) 他们都用于游戏物体分类&#xff0c;但是侧重点不一样。 标签便于代码中对特定物体进行操作。 图层则服务于渲染和碰撞管理&#xff0c;如控制摄像机渲染、光源影响及碰撞设置。 标签和图层的位置&#xff1a; &#xff08;1&#xff09;标签Tag…

Jmeter基础篇(22)服务器性能监测工具Nmon的使用

一、前言 我们在日常做压测的过程中&#xff0c;不仅仅需要监控TPS&#xff0c;响应时间&#xff0c;报错率等这些系统基础性能数据&#xff0c;还需要对服务器的性能&#xff08;如CPU、磁盘、内存、网络IO等&#xff09;做监控&#xff0c;以求对系统运行过程中的硬件性能有…

IDEA最新最全设置教程(包括常用的插件)

一、目的 统一安装一些必要的插件,方便大家开发。统一代码格式、注释格式、统一字符集编码。新加入的同事可以快速适应和熟悉,不需要在讲解IDEA配置问题。二、IDEA要修改的设置 新项目设置和设置 1. Java编译版本 这里请使用自己的JDK 2. 统一IDEA字符集 统一使用UTF-8 无…

日本IT工作好找吗?

在日本做IT是否好找工作&#xff0c;实际上取决于多个因素&#xff0c;包括个人的技术能力、日语水平、工作经验以及市场需求等。以下是对这一问题的详细分析&#xff1a; 技术能力与日语水平 技术能力&#xff1a;IT行业是一个技术密集型行业&#xff0c;技术能力自然是求职…

多端校园圈子论坛小程序,多个学校同时代理,校园小程序分展示后台管理源码

社团活动与组织 信息发布&#xff1a;系统支持社团发布活动信息、招募新成员等&#xff0c;方便社团进行线上线下活动的组织和管理。 增强凝聚力&#xff1a;通过系统&#xff0c;社团成员可以更好地交流和互动&#xff0c;增强社团的凝聚力和影响力。 生活服务功能 二手市场…

用 Python 从零开始创建神经网络(六):优化(Optimization)介绍

优化&#xff08;Optimization&#xff09;介绍 引言 引言 在随机初始化的模型中&#xff0c;或者即使是采用更复杂方法初始化的模型中&#xff0c;我们的目标是随着时间的推移培训或教育一个模型。为了训练一个模型&#xff0c;我们调整权重和偏差以提高模型的准确性和置信度…

架构篇(04理解架构的演进)

目录 学习前言 一、架构演进 1. 初始阶段的网站架构 2. 应用服务和数据服务分离 3. 使用缓存改善网站性能 4. 使用应用服务器集群改善网站的并发处理能力 5. 数据库读写分离 6. 使用反向代理和CDN加上网站相应 7. 使用分布式文件系统和分布式数据库系统 8. 使用NoSQL和…

Linux软件包管理与Vim编辑器使用指南

目录 一、Linux软件包管理器yum 1.什么是软件包&#xff1f; 2.什么是软件包管理器&#xff1f; 3.查看软件包 4.安装软件 ​编辑 5.卸载软件 Linux开发工具&#xff1a; 二、Linux编辑器---vim 1.vim的基本概念 (1) 正常/普通模式&#xff08;Normal mode&#xff0…

嵌入式硬件实战基础篇(一)-STM32+DAC0832 可调信号发生器-产生方波-三角波-正弦波

引言&#xff1a;本内容主要用作于学习巩固嵌入式硬件内容知识&#xff0c;用于想提升下述能力&#xff0c;针对学习STM32与DAC0832产生波形以及波形转换&#xff0c;对于硬件的降压和对于前面硬件篇的实际运用&#xff0c;针对仿真的使用&#xff0c;具体如下&#xff1a; 设…

怎么样绑定域名到AWS(亚马逊云)服务器

1&#xff0c;拿着你买的域名去亚马逊申请一个证书。申请证书分两种&#xff0c;一种是去亚马逊后台填域名手动申请 &#xff0c;另一种是通过API来申请&#xff0c;类似如下代码&#xff1a; 2、证验证书。有两种方式&#xff1a;一种是通过邮件&#xff0c;另一种去到域名提供…

【网络安全】公钥基础设施

1. PKI 定义 1.1 公钥基础设施的概念 公钥基础设施&#xff08;Public Key Infrastructure&#xff0c;简称PKI&#xff09;是一种基于公钥密码学的系统&#xff0c;它提供了一套完整的解决方案&#xff0c;用于管理和保护通过互联网传输的信息。PKI的核心功能包括密钥管理、…

【计算机网络】UDP网络程序

一、服务端 1.udpServer.hpp 此文件负责实现一个udp服务器 #pragma once#include <iostream> #include <string> #include <cstdlib> #include <cstring> #include <functional> #include <strings.h> #include <unistd.h> #incl…

定时器简介

TIM(Timer定时器)简介 在第一部分,我们主要讲的是定时器基本定时的功能&#xff0c;也就是定一个时间&#xff0c;然后让定时器每隔这个时间产生一个中断&#xff0c;来实现每隔一个固定时间执行一段程序的目的&#xff0c;比如你要做个时钟、秒表&#xff0c;或者使用一些程序…

【论文阅读】HITS: High-coverage LLM-based Unit Test Generation via Method Slicing

HITS: High-coverage LLM-based Unit Test Generation via Method Slicing 1. 来源出处 本文是发表在2024年39th IEEE/ACM International Conference on Automated Software Engineering (ASE)上的论文。作者包括Zejun Wang, Kaiibo Liu, Ge Li和Zhi Jin,他们来自北京的PKU …

多模态大模型开启AI社交新纪元,Soul App创始人张璐团队亮相2024 GITEX GLOBAL

随着AI在全球范围内的加速发展和广泛应用,各行业纷纷在此领域发力。作为全球最大的科技盛会之一,2024年的GITEX GLOBAL将目光再次聚焦于人工智能的飞速发展,吸引了超过6700家来自各个领域的企业参与。在这样的背景下,Soul App作为国内较早将AI技术应用于社交领域的平台,首次亮相…

爬虫开发工具与环境搭建——使用Postman和浏览器开发者工具

第三节&#xff1a;使用Postman和浏览器开发者工具 在网络爬虫开发过程中&#xff0c;我们经常需要对HTTP请求进行测试、分析和调试。Postman和浏览器开发者工具&#xff08;特别是Network面板和Console面板&#xff09;是两种最常用的工具&#xff0c;能够帮助开发者有效地捕…