当前位置: 首页 > news >正文

Vue之脚手架与组件化开发

一、基础知识
1、准备工作

node版本在12以上(看情况而变)

全局安装vue/cli脚手架(不理解的可以去看一下node安装环境配置教程)

npm i @vue/cli -g

2、项目初始化

在终端输入

vue create my-vue-project(这里是名字,自定即可)

之后选择vue3、vue2或者自定义模板创建

或者输入vue ui,以图形化的形式创建,创建过程都差不多

创建成功后,启动项目并成功显示,则初始化项目成功

3、目录结构

node_modules是该项目需要的一些依赖包和其它第三方工具包

public是静态资源包,保留的都是一些不参与编译的资源

src保留的都是一些参与编译的资源,该包下的App.vue是根组件,main.js则是入口文件用来对vue做一些配置

vue.config.js是用来配置vue/cli项目的文件

package.json中有一些比较常用的命令,比如serve、build,分别是启动项目、打包项目

4、打包项目

终端输入一下命令,打包项目

npm run build

打包完之后会生成一个dist文件

5、运行打包的项目

这个打包后的项目想要运行,需要一个服务器,我们这里下载一个serve服务器工具来运行

下载命令

npm i serve -g

运行命令

serve dist

二、组件化开发

1、什么是组件

组件是封装页面部分功能的一种方式

.vue后缀的都叫做单文件组件,都由template、script、style三部分组成

2、组件通信

父组件传子组件

通过msg="xxxxxxx"传输,当然这里的msg是可以自定义的不是固定的

通过props接收,这里的msg要对应父组件的msg,名字要一模一样,接收的时候要规范类型,当然也要根据父组件传递的信息来规定

props的多种写法

子组件传父组件

子组件

父组件

HelloWorld.vue

<template><div class="hello"><h1>{{ msg }}</h1><p>props中的count:{{ count }}</p><button @click="handler">按钮</button></div>
</template><script>
//组件通行
//父传子:通过props进行处理
//子传父:通过$emit进行触发
export default {name: "HelloWorld",props: {msg: String,count: {type: [String, Number],// default: 100,required: true,},},data() {return {childCount: 0,};},methods: {handler() {this.childCount++;this.$emit("child-count-change", this.childCount);},},
};
</script><!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {margin: 40px 0 0;
}
ul {list-style-type: none;padding: 0;
}
li {display: inline-block;margin: 0 10px;
}
a {color: #42b983;
}
</style>

App.vue

<template><div id="app"><img alt="Vue logo" src="./assets/logo.png" /><h1>父组件中接收到的数据:{{ childData }}</h1><HelloWorldmsg="Welcome to Your Vue.js App":count="parentCount"@child-count-change="handler"/></div>
</template><script>
import HelloWorld from "./components/HelloWorld.vue";export default {name: "App",components: {HelloWorld,},data() {return {parentCount: 10000,childData: 0,};},methods: {handler(childCount) {this.childData = childCount;},},
};
</script><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;
}
</style>

三、组件插槽

同一个子组件不同的展示需要用到插槽

HelloWorld.vue

<template><div class="hello"><slot>基础的默认内容</slot><h1>{{ msg }}</h1><p>props中的count:{{ count }}</p><button @click="handler">按钮</button><slot name="footer">footer的默认内容</slot></div>
</template><script>
//组件通行
//父传子:通过props进行处理
//子传父:通过$emit进行触发
export default {name: "HelloWorld",props: {msg: String,count: {type: [String, Number],// default: 100,required: true,},},data() {return {childCount: 0,};},methods: {handler() {this.childCount++;this.$emit("child-count-change", this.childCount);},},
};
</script><!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {margin: 40px 0 0;
}
ul {list-style-type: none;padding: 0;
}
li {display: inline-block;margin: 0 10px;
}
a {color: #42b983;
}
</style>

App.vue

<template><div id="app"><img alt="Vue logo" src="./assets/logo.png" /><h1>父组件中接收到的数据:{{ childData }}</h1><HelloWorldmsg="Welcome to Your Vue.js App":count="parentCount"@child-count-change="handler">这是默认内容1<template #footer>第一个footer</template></HelloWorld><HelloWorld>这是默认内容2</HelloWorld><HelloWorld>这是默认内容3</HelloWorld><HelloWorld></HelloWorld></div>
</template><script>
import HelloWorld from "./components/HelloWorld.vue";export default {name: "App",components: {HelloWorld,},data() {return {parentCount: 10000,childData: 0,};},methods: {handler(childCount) {this.childData = childCount;},},
};
</script><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;
}
</style>

相关文章:

  • Linux 命令如何同时支持文件参数与管道输入?
  • 时序建模演进之路:从 MLP、RNN 到 LSTM 与 GRU
  • 【Leetcode 每日一题】2071. 你可以安排的最多任务数目
  • 使用Delphi 和 CrossVcl 开发基于VCL的 macOS 和 Linux 应用程序简介
  • C#中的LINQ:简化数据查询与操作
  • Rust多线程性能优化:打破Arc+锁的瓶颈,效率提升10倍
  • ActiveMQ 性能优化与网络配置实战(二)
  • 【信息系统项目管理师-论文真题】2022上半年论文详解(包括解题思路和写作要点)
  • 【QNX+Android虚拟化方案】138 - USB 底层传输原理
  • Webug4.0靶场通关笔记07- 第9关反射XSS和第10关存储XSS
  • 2025年RAG技术发展现状分析
  • C++负载均衡远程调用学习之TCP连接封装与TCPCLIENT封装
  • 【C++学习笔记】深入理解虚函数和多态
  • 操作系统OS是如何指挥外围设备的呢?
  • 量子加密通信:打造未来信息安全的“铜墙铁壁”
  • MySQL与分布式架构的碰撞
  • 开源飞控软件:推动无人机技术进步的引擎
  • 深入探讨宾馆一次性牙刷价格,市场价格区间差异大
  • 【Vue bug】:deep()失效
  • Chromium 134 编译指南 - Android 篇:从Linux版切换到Android版(六)
  • 国铁集团:5月1日全国铁路预计发送旅客2250万人次
  • 近七成科创板公司2024年营收增长,285家营收创历史新高
  • 五一去哪儿|外国朋友来中国,“买买买”成为跨境旅游新趋势
  • 违规行为屡禁不止、责任边界模糊不清,法治日报:洞穴探险,谁为安全事故买单?
  • 69岁朱自强被查,曾任南京地铁总经理
  • 日本希望再次租借大熊猫,外交部:双方就相关合作保持密切沟通