Vue2使用Vue CLI学习笔记

news2024/11/14 11:18:10

Vue2构建项目分析

Vue学习官网
Vue CLI官方

# 全局安装,只要装一次,以管理员身份
npm install -g @vue/cli
# 查看脚手架工具版本
vue --version
# 创建项目,注意路径,名称不能是中文
vue create my-project
# 启动项目,找package.json中的script,看是serve还是dev
npm run serve

项目结构

生成项目如下:
项目结构

src目录下:

  • main.js:运行文件,类似于启动类
  • App.vue:app根组件

App.vue 组件通常是根组件,它会被挂载到 index.html 中的 id=“app” 的 DOM 元素上。这个挂载过程通常在 main.js 文件中完成。
下面对main.js进行浅析

import Vue from 'vue'	// 导入vue.js核心包
import App from './App.vue'	// 导入根组件

Vue.config.productionTip = false // 是否显示生产标识

// 创建vue实例
new Vue({
  render: h => h(App), // 返回虚拟dom
}).$mount('#app')
  • render 属性(函数)根据组件构建出对应的虚拟DOM树,将虚拟 DOM 树转化为实际 DOM 的工作则由 Vue 内部处理。
  • .$mount('#app')相当于el属性赋值挂载对象

vue组件

组件是一个vue实例。
这个vue实例带名字,同时可复用,不能赋值el

结构很清晰:模版template、逻辑代码script、样式style

  • template 只能有一个根节点
  • style 默认作用全局,局部作用,在style标签中添加scoped
  • data 是个函数

为了保证可复用性,一个组件的 data 选项必须是一个函数
返回的是一个对象,每次调用的时候返回的都是一个新创建的对象

data: function () {
  return {
    count: 0
  }
}

结合了ES6 模块化语法,导出一个 Vue 组件的配置对象,使得该组件可以在其他地方被导入和使用

export default {
	...
}

scoped的实现原理:
为当前组件的所有元素添加一个唯一的属性(如 data-v-xxxxxx),给当前的样式上都添上一个属性选择器。

组件注册

类比于局部变量全局变量局部注册按需导入,全局注册无需导入,全局使用。
全局注册通过改变 Vue 构造函数的全局组件注册表,使得每个由 Vue 构造函数创建的实例都可以访问这些注册的组件。

Vue.component('组件名', 组件对象)

组件通信

就是组件之间的数据传递
关系:父子,非父子,vuex处理复杂情况

父传子

父组件向子组件提供数据修改数据的函数
子组件通过设置property的方式,声明想要获得的数据和函数,父组件通过v-bind给子组件传值,v-on传修改函数
组件传值
具体操作如下:

  1. 传值
    子组件在对象中添加props,可以是数组,或者对象,父组件直接:属性名="值"

    //  字符串数组
    props: ['title', 'likes', 'isPublished', 'commentIds', 'author']
    // 对象,有校验提示,也可以自定义校验方式
    props: {
      title: String,
      likes: Number,
      isPublished: Boolean,
      commentIds: Array,
      callback: Function,
      contactsPromise: Promise // or any other constructor
    }
    
  2. 传修改函数
    子组件中调用$emit函数,相当于在子组件对象中注册并触发一个新事件,同时提供参数
    父组件监听该事件,并给出响应函数(修改函数)
    由此表现为子组件调用并传递参数给一个在父组件中定义的方法

    // 子组件
    methods: {
      doSomething() {
        // 做一些事情
        this.$emit('actionHappened', 'some data');
      }
    }
    

    在这里,doSomething 方法触发了 actionHappened 事件,并且向父组件传递了 'some data' 作为参数。

    然后在父组件中,你可能会这样监听这个事件:

    <!-- 父组件的模板 -->
    <child-component @actionHappened="handleAction"></child-component>
    

    在父组件的 JavaScript 部分,你会定义 handleAction 方法来处理这个事件:

    // 父组件
    methods: {
      handleAction(data) {
        console.log('Event received with:', data);
        // 做一些响应事件的处理
      }
    }
    
非父子

父子组件传递,父组件是可以直接拿到子组件对象的,直接赋值即可
非父子组件,需要一个公共对象,这个对象两个组件都能获取,这里叫“事件总线”

utils\eventBus.js:

import Vue from "vue"

const Bus = new Vue()

export default Bus

非父子组件传值

A组件:获得Bus对象,给Bus对象中的updateNews添加函数体:修改A组件中的news属性

<script>
import Bus from '@/utils/eventBus';

export default {
    data () {
        return {
            news: '黑神话悟空榜首'
        }
    },
    created() {
        Bus.$on('updateNews',(news)=>{
            this.news = news
        })
    },
}
</script>

B组件:点击按钮调用Bus对象中的updateNews函数

<template>
    <div class="aComponent">
        <p>我是B组件</p>
        <button @click="changeInfo">修改新闻</button>
      </div>
</template>

<script>
import Bus from '../utils/eventBus'

export default {
    methods: {
        changeInfo(){
            Bus.$emit('updateNews','广东多地宣布今起停课')
        }
    }
}
</script>

跨层级父传后代,vue提供provide & inject 机制

.sync 同步

关于双向数据绑定的原理:
就是两个对象内的变量之间实现值的同步变化
v-model就是数据和视图数据的绑定,属性名为value
双向数据
在属性名后面加.sync就相当于自动生成了对应的修改函数,函数名为update:属性名
例子:控制子组件的显示
控制子组件的显示
子组件:添加visable属性,作为v-show的值,添加事件调用修改函数

<template>
  <div class="myDialog" v-show="visable">
    <button @click="close">关闭对话框</button>
  </div>
</template>

<script>
export default {
    props: {
        visable: Boolean
    },
    methods:{
        close(){
            this.$emit('update:visable',false)
        }
    }
}
</script>

父组件:直接把子组件的visable与isShowDialog进行双向绑定了

<template>
    <div class="cComponent">
        <p>我是C组件</p>
        <button @click="isShowDialog = true">显示对话框</button>
        <MyDialog :visable.sync="isShowDialog" ></MyDialog>
      </div>
</template>

<script>
import MyDialog from "./MyDialog.vue";
export default {
    components: {
        MyDialog
    },
    data () {
        return {
            isShowDialog: false
        }
    }
}
</script>

ref属性

操作dom元素需要获得dom元素对象,ref属性可以类比id属性
好处:

  1. 直接document.querySelector..作用整个文档,ref作用当前组件
  2. vue中组件可视为标签元素,ref也可以标记组件,获得组件对象

使用:

  1. 标签元素上添加ref属性
  2. 获得元素:this.$refs.值

为了提升性能,vue的dom更新是异步的,$nextTick 函数用于确保在 DOM 更新完成后立即执行某些操作,可以在这个函数里获得更新的dom元素

基于vue-cli自定义创建项目

选择自定义构建
选择自定义构建
根据需求选择工具
选择工具
选择无分号规范(标准)
选择无分号规范
总体选择
总体选择

ESlint代码规范

规范项目开发中的代码书写风格
JavaScript standard 代码规范的全文

可以根据报错手动修正
也可以使用vscode插件ESLint自动格式化

在vscode setting.json中

// 保存代码不自动格式化
    "editor.formatOnSave": true,
     // eslint自动修复错误
    "editor.codeActionsOnSave": {
        "source.fixAll.eslint": true
    },

项目打包上线

vue-cli不参与上线,只是协助开发

过程:
将多个文件合并压缩成一个文件
语法降级(babel工具)
less,sass,ts语法解析

脚手架提供的打包命令:npm run build,最后生成一个dist文件夹

直接生成的文件中使用的是绝对路径,需要配置成相对路径
vue.config.js文件下进行更改

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  publicPath: './',	// 修改成相对路径
  transpileDependencies: true
})

直接打包后会将所有js文件合并成一个,js包过于庞大,影响界面加载
官方:vue路由懒加载

在router中把原来引入组件的方式改成下面这种方式
webpack路由懒加载

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

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

相关文章

基于Ant-Design-Vue设计的配置化表单

适用vue 3.4 版本以上 在日常的前端开发中&#xff0c;表单开发必不可少&#xff0c;尤其是在遇到一些大型的复杂的表单&#xff0c;这往往会变成一个痛点。于是就想着开发一个可以list来配置的表单组件。 先上组件代码 <!-- 该组件 VUE 版本在 3.4 以上可使用--> <…

【AI绘画】Midjourney进阶:景别详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;为什么要学习景别景别的作用景别应用实例 &#x1f4af;大景别&#x1f4af;远景特点提示词书写技巧测试 &#x1f4af;全景特点提示词书写技巧测试注意点 &#x1f…

ozon免费选品工具,OZON免费选品神器

在跨境电商的浩瀚海洋中&#xff0c;寻找那片属于自己的盈利蓝海&#xff0c;是每个商家梦寐以求的目标。随着俄罗斯电商市场的迅速崛起&#xff0c;Ozon平台以其庞大的用户基数和不断增长的市场份额&#xff0c;成为了众多跨境卖家眼中的“香饽饽”。然而&#xff0c;面对琳琅…

【渗透测试】——DVWA靶场搭建

&#x1f4d6; 前言&#xff1a;DVWA&#xff08;Damn Vulnerable Web Application&#xff09;是一个用于安全漏洞测试的 PHP/MySQL 网络应用&#xff0c;旨在为安全专业人士提供一个合法的环境&#xff0c;以测试他们的技能和工具&#xff0c;同时帮助 Web 开发者更好地理解 …

计算机的信息编码和基本运算(上)

大家好我是清墨&#xff0c;今天同同同样来分享一下笔记。 计算机的信息编码 计算机用二进制编码的方式来表示和存储信息&#xff0c;我们见到的信息&#xff08;文字、图片等&#xff09;都是经过转换处理的。 ASCII&#xff08;American Standard Code for Information Int…

[001-02-001]. 第07-02节:线程的创建与使用

我的后端学习大纲 我的Java学习大纲 1、方式1&#xff1a;继承Thread类&#xff1a; 1.1.实现步骤 1.创建一个继承于Thred()类的子类2.重写Thread类的run()3.创建Thread类的子类的对象4.通过这个对象去调用start()方法 在调用start方法时就做了两件事&#xff0c;分别是&…

贪心问题———区间覆盖

输入样例&#xff1a; 1 5 3 -1 3 2 4 3 5 输出样例&#xff1a; 2 分析&#xff1a; 我们根据贪心的思路&#xff0c;能覆盖更大的范围就意味着能用更少的区间段 我们将线段从左端点进行排序 代码演示&#xff1a; #include <iostream> #include <vector>…

从0开始的算法(数据结构和算法)基础(十一)

回溯算法 什么是回溯算法 回溯算法&#xff0c;根据字面意思来理解这个算法是将每一步的操作可以进行回溯&#xff0c;实际上是对这个每一步的操作进行记录&#xff0c;确保可以返回上一步的操作&#xff0c;可能是对回溯操作之前的做一个复现&#xff0c;也有可能是可操作的回…

STM32与ESP8266的使用

串口透传 “透传”通常指的是数据的透明传输&#xff0c;意思是在不对数据进行任何处理或修改的情况下&#xff0c;将数据从一个接口转发到另一个接口。值得注意的是要避免串口之间无限制的透明&#xff0c;可以采用互斥锁的方式进行限制使用方法 对USART1和USART3(用他俩举例…

高效物流管理从固乔快递批量查询助手开始

固乔快递批量查询助手&#xff1a;物流管理的智能化升级 固乔快递查询助手&#xff1a;批量追踪&#xff0c;物流无忧 轻松应对海量单号&#xff0c;固乔快递批量查询助手来帮忙 跨境电商新利器&#xff1a;固乔快递批量查询助手 高效物流管理从固乔快递批量查询助手开始 …

Spring-AOP核心源码、原理详解前篇

本文主要分4部分 Aop原理介绍介绍aop相关的一些类通过源码详解aop代理的创建过程通过源码详解aop代理的调用过程Aop代理一些特性的使用案例 Spring AOP原理 原理比较简单&#xff0c;主要就是使用jdk动态代理和cglib代理来创建代理对象&#xff0c;通过代理对象来访问目标对象…

漏洞复现-泛微-E-Cology-SQL

更多漏洞分析复现&#xff0c;可前往无问社区查看http://www.wwlib.cn/index.php/artread/artid/10358.html 0x01 产品简介 泛微e-cology是一款由泛微网络科技开发的协同管理平台&#xff0c;支持人力资源、财务、行政等多功能管理和移动办公。 0x02 漏洞概述 泛微e-cology…

路由器WAN口和LAN口有什么不一样?

“ 路由器WAN口和LAN口的区别&#xff0c;WAN是广域网端口&#xff0c;LAN是本地网端口。WAN主要用于连接外部网络&#xff0c;而LAN用来连接家庭内部网络&#xff0c;两者主要会在标识上面有区别。以往大部分路由器的WAN只有一个&#xff0c;LAN口则有四个或以上&#xff0c;近…

shader 案例学习笔记之偏移

效果 代码 #ifdef GL_ES precision mediump float; #endifuniform vec2 u_resolution; uniform float u_time;vec2 brickTile(vec2 _st, float _zoom){_st * 5.;_st.x step(1., mod(_st.y,2.0)) * 0.5;return fract(_st); }float box(vec2 _st, vec2 _size){_size vec2(0.5)…

红帽9中nginx-源码编译php

什么是PHP-FPM&#xff1f; PHP-FPM(FastCGI Process Manager&#xff1a; FastCGI进程管理器)是一个实现了Fastcgi的程序&#xff0c;并且提供进程管理的功能。 进程包括master进程和worker进程。master进程只有一个&#xff0c;负责监听端口&#xff0c;接受来自web server 的…

Linux进程(2)(进程状态 - 僵尸、孤儿进程)

目录 1.进程状态 1&#xff09;直接谈论Linux的进程状态 R &#xff1a;进程运行的状态 S &#xff1a;休眠状态 &#xff08;进程在等待“资源”就绪&#xff1b;可中断睡眠&#xff09; T / t &#xff1a;让进程暂停&#xff0c;等待被进一步唤醒 D …

【springboot】整合spring security 和 JWT

目录 1. 整合spring security 1. 导入依赖 2. 配置类 3. 实体类实现UserDetails接口 4. 业务逻辑实现类实现UserDetailsService接口 5. 控制类实现登录功能 6. 测试登录功能 2. 分析源码 1. UsernamePasswordAuthenticationToken 2. A…

【c/c++】类型转换:隐式类型转换、强制类型转换

目录 前言 一、了解类型转换 二、隐式类型转换 1.适用场景 2.转换规则 三、强制类型转换 适用场景 使用规则 注意事项 前言 类型转换是编程中一个常见的现象。在我们进行编码的时候不经意间就发生了&#xff0c;但却能让整个程序运行得更加流畅。 但是这种不经意&am…

C++:STL之vector

1.vector的使用 1.1vector的定义 使用vector需要包含头文件 #include<vector> vector的构造 &#xff08;constructor&#xff09;构造函数声明接口说明vector() (重点)无参构造vector(size_type n,const value_type& val value_type())用n个val初始化并构造vecto…

Java11环境安装(Windows)

目录 1 Java11安装2 配置2.1 JavaHome配置2.2 CLASSPATH配置PATH路径配置 3 验证 1 Java11安装 从官网下载Java11安装包&#xff1a;jdk-11_windows-x64_bin.exe,安装时选择安装到D:\Java目录。 安装完目录结构如下&#xff1a; 2 配置 2.1 JavaHome配置 如下图所示配置JAV…