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

javascript 复制代码
<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

javascript 复制代码
<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png" />
    <h1>父组件中接收到的数据:{{ childData }}</h1>
    <HelloWorld
      msg="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

javascript 复制代码
<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

javascript 复制代码
<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png" />
    <h1>父组件中接收到的数据:{{ childData }}</h1>
    <HelloWorld
      msg="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>
相关推荐
Sunlightʊə1 小时前
2.登录页测试用例
运维·服务器·前端·功能测试·单元测试
Code Crafter2 小时前
ES6-ES14 新特性速查
前端·ecmascript·es6
Lhuu(重开版2 小时前
CSS从0到1
前端·css·tensorflow
CDwenhuohuo2 小时前
微信小程序里用 setData() 修改数据并打印输出 的几种写法
javascript·微信小程序·小程序
不说别的就是很菜3 小时前
【前端面试】HTML篇
前端·html
前端一小卒3 小时前
生产环境Sourcemap策略:从苹果事故看前端构建安全架构设计
前端·javascript
im_AMBER3 小时前
React 18
前端·javascript·笔记·学习·react.js·前端框架
老前端的功夫4 小时前
Vue2中key的深度解析:Diff算法的性能优化之道
前端·javascript·vue.js·算法·性能优化
集成显卡4 小时前
AI取名大师 | PM2 部署 Bun.js 应用及配置 Let‘s Encrypt 免费 HTTPS 证书
开发语言·javascript·人工智能
han_4 小时前
前端高频面试题之Vue(高级篇)
前端·vue.js·面试