01-Vue Cli与组件化开发(vue 全家桶01)(你一定要会搭建)

Vue Cli官网:介绍 | Vue CLI

1.组件本质:一个自定义的标签

普通标签:只有html结构

组件:有html结构,css样式,js业务逻辑

2.组件作用:复用.把页面上 可重用的部分 封装为 组件,从而方便项目的 开发 和 维护

一个组件相当于一个vue实例

 

1.1-单文件组件

1.单文件组件 : 把每一个组件放到一个独立的文件里

      好处:(1)便于维护 (2)便于复用

      之前的学习中,当一个页面非常复杂的时候,我们需要把所有的结构都写在一个html中,非常的不便于维护

       vue提供了一个专业的工具来帮我们将每一个组件放到一个独立的文件中管理

2.组件文件的后缀名是.vue文件

3.这个.vue文件主要由三个部分组成

template: 这里写组件的HTML结构模板

script : 这里写组件的js业务逻辑。组件中的data、methods、计算属性,声明周期钩子等都写在这里

style : 这里写组件的css样式

1.2-Vue cli工具安装

 1.在任何位置打开终端小黑窗,输入命令(需要耐心等待5分钟左右)

     npm install -g @vue/cli

 2.如果安装失败,例如下图所示。解决方案如下

一般是由于网速较慢下载到一半导致中断,多试几次即可

  (1)清除npm缓存,再重新安装

      清除缓存命令:npm cache clean -f

  (2)检查有没有安装成功:vue --version  

02-vue cli脚手架使用教程

  • 1.默认情况下,浏览器只能识别html,css,js后缀文件,无法识别 .vue后缀文件,所以要想让浏览器识别.vue后缀文件,我们需要借助一些插件来帮我们将.vue文件转成浏览器可以识别的html文件

    • 类似于我们以前学习的less,需要借助插件Easy LESS先转成css文件浏览器才可以识别

  • 2.脚手架作用

    • (1)生成规范的vue项目目录

    • (2)底层基于webpack, 将后缀名为 .vue 的文件 编译成浏览器可以识别的 html文件

 

1.1-Vue脚手架安装流程

  • 脚手架 :指的一个项目的目录结构

    • a. 我们以前写项目的时候,会把js文件放到js文件夹,css文件放到css文件夹,图片文件可能放在images文件夹,也可能放在imgs文件夹。第三方框架可能放在libs文件夹,也有可能放在js文件夹

      • 尽管在vue之前,我们已经有这种项目文件夹命名规范的意识,但是无法避免会有一些差异

    • b. 有了脚手架之后,可以一键帮我们生成项目统一的目录结构,我们只需要写页面逻辑,而无需为了取名而烦恼。

  • vue-cli生成脚手架官网文档传送门:创建一个项目 | Vue CLI

1.创建vue项目 :vue create 项目名称

a. 在哪里打开黑窗,就在哪里创建项目

b.项目名称不要有中文,也不要有大写字母

    正确名称: vue create 01-index

c.最好使用系统自带终端打开,千万不要使用git bash!

2.选择默认配置

      第一次比较久,需要耐心等待

 3.成功提示

 4.运行项目的命令的位置是项目根目录,与package.json文件同级

  命令:  npm run serve

终端开启之后不要关闭,此时我们修改代码无需重新运行,浏览器会自动刷新

1.2-脚手架文件目录介绍

 vuecil-demo         # 项目目录
    ├── node_modules # 项目依赖的第三方包
    ├── public       # 静态文件目录
      ├── favicon.ico# 浏览器小图标
      └── index.html # 单页面的html文件(网站首页,vue会帮我们配置好,使用较少)
    ├── src          # 业务文件夹(项目核心文件夹,我们写的项目代码都放在这个文件夹里面)
      ├── assets     # 静态资源(一般项目图片、css都放在这里)
        └── logo.png # vue的logo图片(没啥用,vue打广告的,可删除)
      ├── components # 组件目录一般我们写的组件都放在这里)
        └── HelloWorld.vue # 欢迎页面vue代码文件 (打广告的,可删除)
      ├── App.vue    # 整个应用的根组件(网站首页index.htm默认会渲染这个根组件)
      └── main.js    # 入口js文件(入口文件,vue实例的创建,根组件的挂载都是在这里完成)
    ├── .gitignore   # git提交忽略配置(默认已经帮我们配置好 )
    ├── babel.config.js  # babel配置(ES6转换ES5工具,一般不用管)
    ├── package.json # 依赖包列表
    ├── README.md    # 项目说明(一般公司代码规范,人员组成之类的可以写在这里)
    └── package-lock.json    # 项目包版本锁定和缓存地址
    └── vue.config.js    # 项目webpack配置项

项目文件夹

  • node_modules : 第三方包管理文件夹

  • public : 网站主页和图标(使用较少)

    • index.html : 网站首页,vue会帮我们配置好,使用较少

    • faviicon.ico:网站图标

  • src: 项目核心文件夹,我们写的项目代码都放在这个文件夹里面

    • assets : 静态资源 (一般项目图片、css都放在这里)

    • components:组件 (一般我们写的组件都放在这里)

    • App.vue : 根组件 (网站首页index.htm默认会渲染这个根组件)

    • main.js : 入口文件 (入口文件,vue实例的创建,根组件的挂载都是在这里完成)

  • .gitignore : git忽略文件,默认已经帮我们配置好

  • .babel.configs : ES6转换ES5工具

  • .package-lock.json:记录项目第三方包下载信息

  • .package.json:记录项目第三方包版本信息

  • README.md :项目说明(一般公司代码规范,人员组成之类的可以写在这里)

  • vue.config.js 项目webpack配置项

main.js 入口文件说明

//1.导入vue框架
import Vue from 'vue'
//2.导入App.vue根组件
import App from './App.vue'
//3.控制台打印提示开关
Vue.config.productionTip = false
//4.创建vue实例
new Vue({
  //默认渲染App.vue组件(根组件)
  render: h => h(App),
}).$mount('#app')//设置挂载点,相当于 el:'#app'

1.3-脚手架准备工作:清理欢迎界面与自定义配置

1.关闭eslint插件(推荐)

      eslint是一个插件, 内置在脚手架项目里配置好了, 运行时检查你的代码风格

      这个插件对代码格式要求很严格, 比如不能随便写分号、代码缩进要规范等等。 对初学者不是很友好,建议关闭

module.exports = {
    // 关闭eslint代码检查
    lintOnSave: false
}

2.修改服务器端口号(可选)

脚手架内置的webpack, 配置文件叫vue.config.js

module.exports = {
  devServer: { // 自定义服务配置
    host:'127.0.0.1',
    open: true, // 自动打开浏览器
    port: 3000
  }
}

3.删除conponents文件夹下的默认介绍组件, 删除App.vue中所有代码

1.4-注册全局组件

官方文档:组件注册 — Vue.js

局部组件和全局组件区别

    局部组件 : 在哪里用就在哪里注册 (用一次,注册一次)

        如果一个组件只在一两个页面用到,就可以局部注册(例如商品详情)  

全局组件 : 在main.js中注册,任何地方都能直接使用 (注册一次,终生可用)

     如果一个组件需要在很多个页面用到,就可以全局注册(例如,弹框、自定义按钮这些)

1.5-组件CSS作用域scoped属性介绍

<style scoped>
/* 
1.默认情况下,如果父组件与子组件有相同的css选择器样式,则父组件的样式会覆盖子组件的样式
2.scoped属性作用 : 如果子组件与父组件有相同样式,则优先加载子组件自身的。如果没有则加载父组件的
 */
/* css */
.box{
    width: 100px;
    height: 100px;
    background-color: red;

}
</style>

scoped作用是什么?

     专业术语: 子组件的css作用域

     说人话: 避免子组件选择器样式被父组件覆盖

scoped原理是什么?

  属性选择器:本质是给子组件添加一个唯一的行内自定义属性,然后通过[data-v-xxx]属性选择器避免样式被父组件覆盖

04-vue组件传值

准备工作(新建两个组件, 一个父组件,一个子组件)

App.vue (父组件)

goods.vue (子组件)

1.1-父组件传值子组件:props

官网文档:组件基础 — Vue.js

使用步骤

第一步:给子组件添加props属性(与data平级)

作用:类似于声明变量,定义要接收的属性名

第二组:在父组件中使用行内自定义 attribute传值 <子组件 属性名="属性值"></子组件>

注意点: prop中的属性不能有大写字母,不要使用驼峰命名。建议使用-作为分隔符。

原因:行内自定义属性attribute不支持大写

子组件


<template>
  <div class="son">
      <h3>我是子组件</h3>
      <!-- 使用时,像使用data中属性一样使用props中的属性
            (1)在js中使用props属性需要通过: this.属性名 。 行内可以省略this
            (2)属性名如果有-,则需要转成驼峰。(因为行内自定义属性不支持大写)
       -->
      <h4>商品名称:{{ goodName }}</h4>
      <h4>商品价格:{{ goodPrice }}</h4>
  </div>
</template>

<script>
export default {
    name:'goods',
    //子组件中声明props : 相当于声明属性
    props:["good-name","good-price"],
    data(){
        return{

        }
    }
}
</script>

<style scoped>
    .son{
        border: 1px solid red;
    }
</style>

父组件

<template>
    <div id="app">
        <h1>我是父组件</h1>
        <!-- 父组件:通过行内自定义属性 来 传递数据给 props -->
        <goods good-name="苹果手机" good-price="5888"></goods>
        <goods good-name="小米手机" good-price="1888"></goods>
    </div>
</template>

<script>

//导入局部组件
import goods from './goods.vue'
export default {
    data(){
        return{

        }
    },
    components:{
        goods
    }
}
</script>

<style>
    #app{
        border: 1px solid #000;
    }
</style>

 

  1. props的作用是什么?

    1. ->传数据

  2. props定义的位置和data同级吗?

  3. props定义的格式是什么?

    1. ['属性1','属性2']

1.2-单向数据流

官方文档:Prop — Vue.js

1.单向数据流: vue规定,父组件传递给子组件的数据是只读的.

    说人话:当数据是从父组件的属性中传递过来的时候,子组件不要直接去修改。

2.单向数据流原因: 子组件修改了父组件传递过来的数据,不会通知父组件。就会造成数据不统一问题

3.细节:引用类型赋值本质是赋值地址,一但修改互相影响,非常不便于维护

 

 子组件:给按钮绑定一个事件,去修改价格。发现vue会报错。并且就算修改了子组件的数据,父组件的数据还是不变,就会造成数据不统一的问题

   单向数据流指的是哪个方向?

   父->子

    水从高处流向低处

1.3-子组件传递数据给父组件:$emit

子组件不能直接修改父组件中的数据,但是可以通过emit来通知父组件修改

1.监听子组件事件:组件基础 — Vue.js

2.$emit用法:https://cn.vuejs.org/v2/api/#vm-emit

3.使用事件抛出一个值:组件基础 — Vue.js

使用步骤

  • 1.子组件中发出通知: this.$emit('事件名',参数)

  • 2.父组件中接收通知: <子组件 @事件名="函数名"></子组件>

    • 父组件中的事件名要与子组件$emit中的事件名一致

  • 3.在父组件的methods中实现这个事件处理函数

    • 一定要搞清楚事件名事件处理函数区别。别蒙圈了,多屡屡。

  • 本质:自定义事件

 

  1. 子组件中通过哪个方法向父组件传递事件?

    1. this.$emit()

  2. 父组件注册的事件名需要和谁对应?

    1. 子组件中$emit('事件名')

1.4-父子组件传值总结

  • 父传子: 使用props

    • 单向数据流

  • 子传父: 使用$emit

    • 事件监听

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值