Vue 进阶一 | 系统性学习 | 无知的我费曼笔记

news2025/4/25 10:59:10

无知的我正在复盘Vue
该笔记特点是

  • 重新整理了涉及资料的一些语言描述、排版而使用了自己的描述
  • 对一些地方做了补充说明。比如解释专有名词、类比说明、对比说明、注意事项
  • 提升了总结归纳性。尽可能在每个知识点上都使用一句话 || 关键词概括
  • 更注重在实际上怎么应用
  • 提出并回答了一些问题

下面的图片是我用思维导图总结的vue知识
从watch到组件

从动态组件到自定义指令

从生命周期到数据共享

文章目录

    • Vue 进阶一
      • 一、vue实例(对象)
        • 1.一个基本的vue的实例
        • 2.新的实例
        • 3.一个实例改变另一个实例中的内容,通过给实例命名
        • 4.在vue外面操作vue实例——操作属性
        • 5.在vue外面操作vue实例——操作方法
        • 6.为vue实例设置属性
        • 7.实例属性ref的用法:相当于是id
        • 8.动态绑定vue实例到页面中
      • 二、Vue组件
        • 1.vue组件
        • 2.vue的生命周期函数
        • 3.一个页面中只有一个div,其他的都是vue组件
      • 三、vue开发模式
        • 1.vue-cli骨架
        • 2.详细步骤
        • 3.webpack-simple模板初体验
      • 四、编写app.vue
        • 1.注意template必须有一个根节点
        • 2.在App.vue组件中使用另一个vue组件
        • 3.组件中嵌套组件
      • 五、在项目中使用bootstrap
        • 1.在index.html中引入bootstrap.css
        • 2.编写组件,组件中使用bootstrap
        • 3.在app.vue中本地注册这些组件并使用
      • 六、组件的全局注册
      • 七、在组件中使用样式
      • 八、各组件中的参数传递
        • 1.父传子
        • 2.子组件调用父组件中的函数并传递参数
        • 3.改进版的参数传递(常用)

Vue 进阶一

一、vue实例(对象)

以下操作的环境是连贯的

1.一个基本的vue的实例

   <head>
   	<meta charset="UTF-8">
   	<title></title>
   </head>
   <body>
   	<div id="app">
   	<h1>
   		{{title}}
   	</h1>
   	<button id="btn" @click="btnclick">show</button>
   	<p v-if="showFlag">显示段落</p>
   	{{lowercasetitle}}
   	</div>
   </body>
   <script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.min.js"></script>
   <script>
   	var v1 = new Vue(
   		{
   			el:"#app",
   			data:{
   				title:"This is Title",
   				showFlag:false
   			},
   			methods:{
   				btnclick:function(){
   					this.showFlag=true;
   					this.updateTitle("this is new title");
   				},
   				updateTitle:function(d){
   					this.title = d;
   					
   				}
   			},
   			computed:{
   				lowercasetitle:function(){
   					return this.title.toLowerCase();
   				}
   			},
   			watch:{
   				title:function(newVal,oldVal){
   					console.log(newVal)
   				}
   			}
   		}
   	);
   </script>

2.新的实例

new Vue({
	el:"#app2"
})

3.一个实例改变另一个实例中的内容,通过给实例命名

在一个实例中,通过调用另一个实例的属性,来操作其属性

var v1 =  new Vue();
var v2 = new Vue({
   	el:"#app2",
   	data:{},
   	methods:{
   		changeTitle:function(){
   			v1.title = "changed title";
   		}
   	}	
});

4.在vue外面操作vue实例——操作属性

setTimeout(function(){
   	v1.title="st title";
},2000);

5.在vue外面操作vue实例——操作方法

setTimeout(function(){
   		v1.btnclick();
},2000);

6.为vue实例设置属性

vue中的实例属性

v1.$data  
v1.$el

设置实例属性

        var data = {
			arg1:"arg1 value"
		};
		var v2 = new Vue({
			el:"#app2",
			data:data,

实例属性还能这么调用: v1.$data.title 相当于 v1.title

7.实例属性ref的用法:相当于是id

通过ref获取元素的DOM

<div id="app">
	<button ref="mybtn1" id="btn" @click="btnclick">show</button>
    <button ref="mybtn2" id="btn" @click="btnclick">show</button>
</div>
		
		methods:{
				btnclick:function(){
					this.$refs.mybtn1.innerText = "tttttbbbbnnnn";
				}
			}

8.动态绑定vue实例到页面中

mount 加载的意思

<div id="app3"></div>
<script>
	var v3 = new Vue({
		template:"<h1>hello</h1>"
	});
	v3.$mount("#app3"); 
</script>

二、Vue组件

1.vue组件

Vue.componet 实现全局注册

		<div id="app1">
			<hello></hello>
		</div>
		Vue.component("hello",{
			template:"<h1>hello</h1>"
		})
		new Vue({
			el:"#app1"
		})
    

注意: div得是vue的实例,组件创建好后,只要被vue注册过的div里面,都能使用该组件

2.vue的生命周期函数

在控制台查看各函数的调用顺序,并调用destroy,再点改变title按钮,发现改变不了,因为已被销毁

<html>
	<head>
		<meta charset="UTF-8">
		<title>生命周期</title>
	</head>
	<body>
		<div id="app1">
			{{title}}
			<button type="button" @click="changeTitle">change title</button>
			<button type="button" @click="destroy">destroy</button>
		</div>
	</body>
	<script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.min.js"></script>
	<script>
		new Vue({
			el:"#app1",
			data:{
				title:"this is title"
			},
			methods:{
				changeTitle:function(){
					this.title= "new title";
				},
				destroy:function(){
					this.$destroy();
				}
			},
			beforeCreate(){
				console.log("beforeCreate")
			},
			created(){
				console.log("created")
			},
			beforeMount(){
				console.log("beforeMount")
			},
			mounted(){
				console.log("mounted")
			},
			beforeUpdate(){
				console.log("beforeUpdate")
			},
			updated(){
				console.log("updated")
			},
			beforeDestroy(){
				console.log("beforeDestory")
			},
			destroyed(){
				console.log("destory")
			}
		})
	</script>
</html>

3.一个页面中只有一个div,其他的都是vue组件

vue组件里的data必须使用function的形式对{}对象进行封装,防止对其他数据的修改。
注意,template里必须有一个根节点。

	<head>
		<meta charset="UTF-8">
		<title>component</title>
	</head>
	<body>
		<div id="app1">
			<my-cap></my-cap>
		</div>
        <div id="app2">
            
        </div>
	</body>
	<script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.js"></script>
	<script>
        new Vue({
            el:"#app2",
            template:"<div>aaa</div>"
        });
        
		Vue.component("my-cap",{
			data(){
				return {
					status:"hellllllllo"
				}
			},
			template:'<p>{{status}}<button @click="changebtn">btn</button></p>',
			methods:{
				changebtn:function(){
					this.status = "enennnnnnn"
				}
			}
			
		});
		new Vue({
			el:"#app1"
		})
	</script>

改进版:提高了代码的重用性——万物皆组件

    var cmp = {
			data(){
				return {
					status:"hellllllllo"
				}
			},
			template:'<p>{{status}}<button @click="changebtn">btn</button></p>',
			methods:{
				changebtn:function(){
					this.status = "enennnnnnn"
				}
			}
		}
		new Vue({
			el:"#app1",
			components:{
				"my-cap":cmp
			}
		})
		new Vue({
		    el:"#app2",
		    components:{
		        "cap":cmp
		    }
		    
		})

三、vue开发模式

1.vue-cli骨架

	CLI(command line interfaces )命令行接口。在进行Vue项目开发时,可以选择不同的Vue模板(骨架)进行项目的搭建,比如simple、webpack-simple、webpack、browserify/browserify-simple等;vue-cli是官方提供的一个脚手架(预先定义好的目录结构及基础代码,咱们在创建 Maven 项目时可以选择创建一个骨架项目,这个骨架项目就是脚手架),用于快速生成一个 vue 的项目模板。

2.详细步骤

下载安装node.js
https://nodejs.org/en/download/

在node.js的cmd组件(command prompt)中安装vue-cli

npm install vue-cli -g

创建vue项目文件夹并打开

mkdir d:/vuedemo

cd d:/vuedemo

使用vue list命令查看当前可用的vue骨架

使用vue命令创建基于vue-webpack-simple骨架的项目,vue-cli-demo是项目名,过程中需要输入一些参数,回车是使用提示的值

vue init webpack-simple vue-cli-demo

创建基于webpack骨架的项目

vue init webpack vue-cli-demo

查阅readme.md文档

npm install  #安装依赖环境

npm run dev	 #进入开发模式

npm run build #发布项目

3.webpack-simple模板初体验

1)进入到项目文件中,安装依赖环境

npm install

2)进入开发模式

npm run dev

如果提示缺少依赖东西,尝试重新 npm install,如果缺少node-sass,执行以下内容:

npm install node-sass

如果npm命令无法使用,可以使用淘宝镜像http://npm.taobao.org/

操作步骤如下:

# 1. 安装cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
# 2. 使用cnpm代替npm
cnpm install
cnpm run dev
cnpm run build

开始组件开发
修改主组件App.vue

<template>
  <div>
  	{{title}}
  </div>
</template>

<script>
export default {
  data(){
  	return {
  		title:"helloooooooo!"
  	}
  }
}
</script>

四、编写app.vue

1.注意template必须有一个根节点

这样会报错。如下

<template>
  <div>
  	{{title}}
  </div>
  <span>
  </span>
</template>

2.在App.vue组件中使用另一个vue组件

新建Home.vue

<template>
	<div>
	label: {{label}}
	<button @click="changeLable">btttttttn</button>
	</div>
</template>
<script>
export default {
	data(){
		return {
			label:"i am a label"
		}
	},
	methods:{
		changeLable(){
			this.label = "yes a label!"
		}
	}
}
</script>
<style>
</style>

修改main.js

定义Home.vue为组件,并设置其标签名字

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

Vue.component("app-server-home",Home)

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

这种是全局注册

修改App.vue

直接使用在main.js中定义的组件的标签名

<template>
  <app-server-home></app-server-home>
</template>

3.组件中嵌套组件

app内使用home,home内使用subcontent。并在home中本地注册subcontent组件。

<template>
	<div>
		<app-server-subcontent v-for="(sc,i) in 5":key="i">
		</app-server-subcontent>
	</div>
</template>
<script>
//本地注册
import SubContent from "./SubContent.vue"
export default {
	components:{
		"app-server-subcontent":SubContent
	}
}
</script>

五、在项目中使用bootstrap

1.在index.html中引入bootstrap.css

<head>
    <meta charset="utf-8">
    <title>vuedemo2</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" />
  </head>

2.编写组件,组件中使用bootstrap

编写header、footer、content组件

header组件

<template>
	<div class="col-xs-12">
		<header>
			This is Header!!!
		</header>
	</div>
</template>

footer组件

<template>
	<div class="col-xs-12">
		<footer>
		All Right Copy
		</footer>
	</div>
</template>

content组件

<template>
	<div class="col-xs-12 col-sm-6">
		<ul class="list-group">
			<li class="list-group-item" v-for="(s,i) in 5" :key="i">
				{{s}}
			</li>
		</ul>
	</div>
</template>

3.在app.vue中本地注册这些组件并使用

<template>
  <div id="app">
    <app-header></app-header>
    <app-content></app-content>
    <app-footer></app-footer>
  </div>
</template>

<script>
	//内部注册
import Footer from  "Footer.vue"
import Header from "Header.vue"
import Content from "Content.vue"
export default {
	components:{
		"app-footer":Footer,
		"app-header":Header,
		"app-content":Content
	}
}
</script>

六、组件的全局注册

在main.js中注册组件,该组件能够在项目中的每个Vue中被使用

import Home from './Home.vue';
Vue.component("appHome",Home);

完成组件注册后,就可以在其他组件中使用:

<template>
	<div>
		<appHome></appHome>
	</div>
</template>

七、在组件中使用样式

在组件中定义样式,组件里的样式会影响所有组件,如何设定,让样式只作用于当前组件?

content组件中的style将会影响整个页面的元素,因此在组件的style标签里加入scoped关键字,让该样式只作用于当前组件。

<template>
	<div class="col-xs-12 col-sm-6">
		<ul class="list-group">
			<li class="list-group-item" v-for="(s,i) in 5" :key="i">
				{{s}}
			</li>
		</ul>
	</div>
</template>

<script>
</script>

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

八、各组件中的参数传递

1.父传子

通过父vue的标签属性传递参数:

App.vue

  • 调用组件标签:import导入组件文件、将组件交给vue并设置组件标签名
  • 在标签里调用组件已经自定义的props里的属性名并为其赋值
<template>
  <div id="app">
    <sub-app :myName="name"></sub-app>
  </div>
</template>

<script>
	//内部注册
import Sub1 from "@/subapp/sub1.vue"
export default {
	data(){
		return {
			name:"xiaoyu"
		}
	},
	components:{
		subApp:Sub1
	}
}
</script>

sub1.vue

<template>
	<div>
		<h1>{{myName}}</h1>
	</div>
</template>

<script>
	export default{
		props:['myName']
	}
</script>

props后存放数组,表示可以拿多个参数。也可以改写成一个对象:

<template>
	<div>
		<h1>{{myName}}</h1>
	</div>
</template>

<script>
	export default{
		//props:['myName']
		props:{
			myName:{
				type:String,
				required:true,
				default:'xx'
			}
		}
	}
</script>

2.子组件调用父组件中的函数并传递参数

App.vue

  • 在组件标签里调用它已经自定义好的事件
  • 然后赋予本地创建的好的方法,该方法可以用参数来接收穿过来的数据
<template>
  <div id="app">
    <sub-app :myName="name" :ffn="changeName"></sub-app>
  </div>
</template>

<script>
	//内部注册
import Sub1 from "@/subapp/sub1.vue"
export default {
	data(){
		return {
			name:"xiaoyu"
		}
	},
	methods:{
		changeName:function(name){
			this.name = name
		}
	},
	components:{
		subApp:Sub1
	}
}
</script>

sub1.vue

<template>
	<div>
		<h1>{{myName}}</h1>
		<button type="button" @click="doClick" >点我</button>
	</div>
</template>

<script>
	export default{
		props:{
			myName:{
				type:String,
				required:true,
				default:'xx'
			},
			ffn:{
				type:Function
			}
		},
		methods:{
			doClick:function(){
				this.ffn("xiaohe");
			}
		}
	}
</script>

3.改进版的参数传递(常用)

从下往上的事件发射

sub1.vue

doClick:function(){
		//this.ffn("xiaohe");
		this.$emit('newName','xiaoliu');
}

App.vue

 <sub-app :myName="name" @newName="name=$event"></sub-app>

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

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

相关文章

20221212英语学习

今日单词&#xff1a; sweet adj.含糖的, 甜的, 香的, 芳香的 founding n.建立,成立 software n.软件 pour n.流出, 大雨, 【冶】浇注, (已熔金属的)一次浇注量 recipe n.烹饪法&#xff0c;食谱&#xff1b;方法&#xff0c;秘诀&#xff0c;诀窍 graph n.图, 图表, 曲线…

Vue2 插槽的使用【默认插槽、具名插槽、作用域插槽】

前言&#xff1a; 这篇文章我们一起来学习一下 Vue2 插槽的使用&#xff0c;文章大致分为两个模块&#xff0c;第一部分是什么是插槽&#xff0c;其作用是什么&#xff0c;第二部分为三种插槽的使用&#xff0c;分别为默认插槽&#xff0c;具名插槽&#xff0c;作用域插槽&…

Vue快速上门|虚拟DOM

直接操作DOM,DOM频繁变动会使得页面不停的布局、渲染,是很消耗性能的,虚拟DOM就是来解决这个问题的。虚拟DOM 就是先在内存中构建一个虚拟DOM结构(JS对象表示),批量操作完成后再一次性的更新到浏览器DOM树上。VUE中的虚拟DOM操作思路也是如此,只是为了更高效,实际要稍微…

[附源码]Node.js计算机毕业设计大数据与智能工程系教师档案管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Docker之RUN、COMMAND、ENTRYPOINT辨析

一 回顾docker一些命令 ① run create start 的辨析 docker run 等价 docker create && docker start容器(动态) 镜像(静态) 读写层1&#xff09; create 命令为指定的镜像&#xff08;image&#xff09;添加了一个可读写层,构成了一个新的容器注意&#xff1…

RNA-seq 详细教程:详解DESeq2流程(9)

学习目标 了解 DESeq2 涉及的不同步骤了解变异的来源并检查 size factors检查基因水平的离散估计了解差异表达分析过程中离散的重要性DESeq2流程 前面&#xff0c;我们使用设计公式创建了 DESeq2 对象&#xff0c;并使用下面两行代码运行DESeq2&#xff1a; dds <- DESeqDat…

《野球少年》:王牌投手·棒球联盟

身为一名投手&#xff0c;原田巧是位拥有着拔群棒球才能的少年。在初中入学时移居的山间城镇新田市&#xff0c;巧与接住自己全力投球的捕手永仓豪相遇了。进入新田东中学棒球部的两人&#xff0c;被卷入部员间的摩擦以及教师们的大人事情&#xff0c;时而相互产生冲突&#xf…

喊一声“嘿!GitHub”,说出需求VS Code就能自己写代码了

喊一句“嘿&#xff01;GitHub”&#xff0c;说出你的需求&#xff0c;代码自动来&#xff01; Python中导入pandas库&#xff0c;只需说一句“import pandas”&#xff1a; 长句语音、一连串命令&#xff0c;都不在话下&#xff1a; 嗯&#xff0c;就是和Siri一个味儿&#x…

ETDR 0A 电缆故障测试仪 手持便携式 电缆故障脉冲反射仪 可测30KM

用途&#xff1a; ETDR 10A-3 采用低压脉冲反射技术&#xff0c;用于快速、 精确测试通信或电力电缆的故障距离。 多种测试模式&#xff0c;适用于断线、短路、低阻、间歇性等故障类型&#xff0c;并能测试接头的位置。 使用环路脉冲发生器(ES 2002)可以更容易测试有分支的电缆…

实验五、U_GSQ对共源放大电路电压放大倍数的影响

一、题目 UGSU_{GS}UGS​ 对共源放大电路 A˙u\dot A_uA˙u​ 的影响。 二、仿真电路 共源放大电路如图(ccc)所示&#xff0c;其中MOS场效应管型号为2N7000。 三、仿真内容 图1(a)为2N7000相关的参数&#xff0c;图1(b)为其转移特性&#xff0c;以作为参考&#xff08;需注…

Python + ffmepg + nginx-html-flv实现摄像头的实时播放

Python ffmepg nginx-html-flv实现摄像头的实时播放 这段时间有个项目需要捕获摄像头的画面&#xff0c;做轨迹分析之后再做显示。做了四天的调研&#xff0c;虽然结果我还不是特别满意&#xff0c;但也颇有收获&#xff0c;在这里做一下总结。 整体的结构大概是这样的&…

redis高并发问题以及解决方案

文章目录1.高并发读操作问题1.1缓存穿透1.2缓存击穿1.3缓存雪崩2.高并发写问题2.1数据库双写不一致问题2.2双写不一致问题解决方案2.2.1延时双删2.2.2队列2.2.3分布式锁1.高并发读操作问题 1.1缓存穿透 指访问一个缓存和数据库中都不存在的key&#xff0c;由于这个key在缓存中…

[附源码]Node.js计算机毕业设计大学生心理健康咨询系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

[附源码]Python计算机毕业设计吃到撑零售微商城Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等…

R语言里的非线性模型:多项式回归、局部样条、平滑样条、 广义相加模型GAM分析

总览 在这里&#xff0c;我们放宽了流行的线性方法的假设。最近我们被客户要求撰写关于非线性模型的研究报告&#xff0c;包括一些图形和统计输出。有时线性假设只是一个很差的近似值。有许多方法可以解决此问题&#xff0c;其中一些方法可以通过使用正则化方法降低模型复杂性…

计算机网络——应用层

应用层概述 计算机网络各层所解决的问题 我们在浏览器的地址中输入某个网站的域名后&#xff0c;就可以访问该网站的内容&#xff0c;这个就是万维网WWW应用&#xff0c;其相关的应用层协议为超文本传送协议HTTP 用户在浏览器地址栏中输入的是“见名知意”的域名&#xff0c;而…

115-127-mysql-高级篇-索引及结构

115-mysql-高级篇-索引及调优篇&#xff1a; 索引及调优篇 1、索引的数据结构 1. 索引及其优缺点 1.1 索引概述 索引的定义为&#xff1a;索引&#xff08;Index&#xff09;是帮助MySQL高效获取数据的数据结构。 **索引的本质&#xff1a;**索引是数据结构。“排好序的快…

Java项目:SSM在线蛋糕商城销售网站项目

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目为前后台项目&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 用户角色包含以下功能&#xff1a; 查看所有蛋…

[附源码]Python计算机毕业设计宠物托管系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等…

redis--主从复制、哨兵和cluster集群

一、介绍redis 在Redis中&#xff0c;实现高可用的技术主要包括持久化、主从复制、哨兵和cluster集群&#xff0c;下面分别说明它们的作用&#xff0c;以及解决了什么样的问题。 持久化&#xff1a; 持久化是最简单的高可用方法&#xff08;有时甚至不被归为高可用的手段&…