day2 学习vue2 笔记 过滤器 侦听器 计算属性 axios

 系列文章目录

day1学习vue2笔记 vue指令

day2 学习vue2 笔记 过滤器 侦听器 计算属性 axios

day3 vue2 学习笔记 vue组件

day4 vue 学习笔记 组件 生命周期 数据共享 数组常用方法

day5 vue 笔记 axios 动态组件 插槽 自定义指令 ESLints

day6 vue 学习笔记 vue-router路由

文章目录

前言

一、vue的指令与过滤器

过滤器的兼容性

二、侦听器

1、什么是watch侦听器

2、深度监听

三、计算属性

四、vue-cli

 1、什么是单页面应用程序

2、什么是  vue-cli

3、安装和使用

4、卸载vue

5、vue-cli 的使用

6、项目

 1、项目构成图:

2、vue项目中 src 目录的构成

3、vue 的运行流程

五、vue 组件

1、什么是组件化开发

2、vue 中的组件化开发

3、vue 组件的三个组成部分

六、axios

1、axios 基础语法

2、通过 axios 请求返回的数据结构如下图

3、GET

 4、POST

5、await 

 6、 axios.get

7、axios.post

总结

1、侦听器

2、计算属性

3、vue-cli

4、vue 组件


前言

提示:vue2的基础学习:


一、vue的指令与过滤器

过滤器(Filters)是vue为卡发着提供的功能,常用与文本格式化。过滤器可以用在两个地方:差值表达式 v-bind 属性绑定

过滤器应该被添加在JavaScript 表达式的尾部,由“管道符”进行调用,实例代码如下:

 私有过滤器

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>vue 的指令过滤器</title>
		<script src="../../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<span>message 的值是:{{message | capi}}</span>
		</div>
	</body>
	<script>
		const cm = new Vue({
			el: '#app',
			data: {
				message:'ABC',
			},
			methods:{
			
			},
			// 过滤器函数,必须定义到 filters 节点之下
			// 过滤器本质就是一个函数
			filters:{
				// 注意 过滤器函数先中的 val 永远都是 “管道符 | ” 前面的那个值
				capi(val){
					// 过滤器中一定需要有返回值
					//charAt 将这方法接受所有值,表示字符串中把索引对应的字符,获取出来
					console.log()
					// toLowerCase() 将字符串转为小写
					// toUpperCase() 将字符串转为大写
					var fist = val.charAt(0).toLowerCase()
					// substring 截取字符串 [)
					fist += val.substring(1,val.length)
					return fist;
				},
			},
		})
	</script>
</html>

 注意:

1、要定义到  filters 节点下,本质是一个函数;

2、在过滤器函数中,一定要有 return 值;

3、在过滤器的形参中,就可以“管道符”前面的的那个值;

4、如果全局过滤器与私有的过滤器名称相同,则按照就近原则,调用私有过滤器;

全局过滤器和私有过滤器

在filters 节点下定义的过滤器称为“私有过滤器”,因为他只能在当前 VM实例所在的 el 区域使用。如果希望在多个Vue实例之间共享过滤器,则可以按照如下的格式定义全局过滤器; 

私有过滤器

 代码如上

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>全局过滤器</title>
		<script src="../../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<span>message 的值是:{{message | capi}}</span>
		</div>
		
		<div id="app2">
			<span>message 的值是:{{message | capi}}</span>
		</div>
	</body>
	<script>
		
		// 使用 Vue 定义全局过滤器
		// 全局过滤器  独立于每一个 VM 实例之外
		// Vue.filter() 方法接受两个参数;
		// 第一个参数,是全局过滤的“名字”
		// 第二个参数,是全局过滤器的“处理函数”
		Vue.filter('capi',(str)=>{
			var val = str;
			var fist = val.charAt(0).toLowerCase();
			// substring 截取字符串 [)
			fist += val.substring(1,val.length);
			return fist;
		})
		
		const cm = new Vue({
			el: '#app',
			data: {
				message:'ABC',
			},
			methods:{},
			// 过滤器函数,必须定义到 filters 节点之下
			// 过滤器本质就是一个函数
			filters:{
				// 注意 过滤器函数先中的 val 永远都是 “管道符 | ” 前面的那个值
				capi(val){
					// 过滤器中一定需要有返回值
					//charAt 将这方法接受所有值,表示字符串中把索引对应的字符,获取出来
					// toLowerCase() 将字符串转为小写
					// toUpperCase() 将字符串转为大写
					var fist = val.charAt(0).toLowerCase()
					// substring 截取字符串 [)
					fist += val.substring(1,val.length)+"~~~"
					return fist;
				},
			},
		})
		
		const cm2 = new Vue({
			el: '#app2',
			data: {
				message:'DEF',
			},
			methods:{},
			filters:{},
		})
		
		
	</script>
</html>

过滤器可以串联多个过滤器·

 过滤器的本质是JavaScript  函数,因此可以接受参数,格式如下:

过滤器的兼容性

过滤器仅才vue2.x 和 1.x 中受支持,在 vue3.x 的版本中删除了过滤器相关的功能。

在企业级项目中

如果使用的是  2.x 版本的vue, 则依然可以使用过滤器相关的功能

如果项目已经升级到了  vue3.x  版本的vue ,官方建议计算属性方法代替被删除的过滤器功能


二、侦听器

1、什么是watch侦听器

watch 侦听器允许开发者件事数据的变化,从而针对数据的变化做出特定的操作

语法格式如下:

 实例:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>侦听器</title>
		<script src="../../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<input v-model="user_name"/>
			<select v-model="user_type">
				<option value="">请选择类型</option>
				<option value="A">A</option>
				<option value="B">B</option>
				<option value="C">C</option>
				<option value="D">D</option>
			</select>
			<hr>
			<span>用户名:</span>
			<input v-model="user_info.user_name"/>
			<br>
			<span>用户类型:</span>
			<select v-model="user_info.user_type">
				<option value="">请选择类型</option>
				<option value="A">A</option>
				<option value="B">B</option>
				<option value="C">C</option>
				<option value="D">D</option>
			</select>
			
		</div>
	</body>
	<script>
		const cm = new Vue({
			el: '#app',
			data: {
				user_name:'ABC',
				user_type:'',
				user_info:{
					user_name:'',
					user_type:'',
				},
				
			},
			// 所有侦听器都应该放到  watch 节点下
			watch:{
				/**
				 * 侦听器本质是一个函数,要监视那个数据的变化就把数据名作为方法名即可
				 * 监听到 user_name 的值变化一次触发一次
				 * @param {Object} newVal  新值  
				 * @param {Object} oldVal 原值
				 * 新值在前,旧值在后
				 */
				// user_name(newVal,oldVal){
				// 	console.log("监听user_name的值变化",newVal,oldVal)
				// },
				// ==============函数式监听器====================
				user_type(newVal,oldVal){
					console.log("监听user_name的值变化",newVal,oldVal)
				},
				
				// ==============================定义对象格式的侦听器================
				/**
				 *定义对象格式的监听器 
				 * 可以刚进入页面时,自动触发一次
				 */ 
				user_name:{
					// handler 侦听器的处理函数
					handler(newVal,oldVal){
						console.log("监听user_name的值变化",newVal,oldVal)
					},
					/**
					 *  immediate 选项默认值是false
					 *  immediate 的作用是,控制监听器是否自动触发一次
					 */
					immediate:true,
					
				},
				// ==================================深度监听===================
				
				user_info:{
					handler(newVal,oldVal){
						console.log(newVal,oldVal)
					},
					/**
					 * 开启深度监听,只要对象中如何一个属性变化,都会触发“对象侦听”
					 */
					deep:true,
					/**
					 * 访问页面时触发一次  侦听器 
					 */
					immediate:true
				},
				// ================只侦听 对象中某一个属性 ====================
				/**
				 * 如果侦听的是对象的子属性的变化,则必须包裹一层单引号
				 */
				'user_info.user_name'(newVal,oldVal){
					console.log(newVal,oldVal)
				},
			},
		})
	</script>
</html>

侦听器的格式

1、方法格式的侦听器

        缺点1:无法在刚进入页面的时候,自动触发 1 次;

        缺点2:如果侦听的是一个对象,如果对象中的属性发生变化,不会触发侦听器;

2、对象格式的侦听器

        优点1:可以通过  immediate 选线,让监听器刚进入页面时触发一次;

        优点2:可以通过 deep 选项,让侦听器深度监听对象中每个属性的变化;

2、深度监听

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>深度侦听</title>
		<script src="../../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<span>用户名:</span>
			<input v-model="user_info.user_name"/>
			<br>
			<span>用户类型:</span>
			<select v-model="user_info.user_type">
				<option value="">请选择类型</option>
				<option value="A">A</option>
				<option value="B">B</option>
				<option value="C">C</option>
				<option value="D">D</option>
			</select>
		</div>
	</body>
	<script>
		const cm = new Vue({
			el: '#app',
			data: {
				user_info:{
					user_name:'',
					user_type:'',
				},
			},
			watch:{
				// user_info:{
				// 	handler(newVal,oldVal){
				// 		console.log(newVal,oldVal)
				// 	},
				// 	/**
				// 	 * 开启深度监听,只要对象中如何一个属性变化,都会触发“对象侦听”
				// 	 */
				// 	deep:true,
				// 	/**
				// 	 * 访问页面时触发一次  侦听器 
				// 	 */
				// 	immediate:true
				// },
				/**
				 * 如果侦听的是对象的子属性的变化,则必须包裹一层单引号
				 */
				'user_info.user_name'(newVal,oldVal){
					console.log(newVal,oldVal)
					
				},
				
			},
		})
	</script>
</html>

总结:

1、如果想让  watch 侦听器进入页面立即执行,则需要使用对象侦听,并使用  immediate  选项;

2、如果需要监听对象,那么则使用对象格式的侦听器,并使用  deep  选项;或者通过方法格式实现   ‘对象.属性’ 进行实现;


三、计算属性

计算属性指的是 通过一系列运算  之后,最终得到的 属性值。

这个动态计算出来的属性值  可以被模板结构或   methods 方法使用。

··  用来拼接值

<span>{{ '用户名:'+`${user_name}     角色:${user_role}`+`${age}`+'  性别:'+sex }}</span>

属性中定义对象需要单引号对属性包裹起来

<div :style="{'background-color':`rgb(${r},${g},${b})`,'width': `${w}`+'px','height':`${h}`+'px'}">

 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<span>红色:</span>
			<input  type="number" min="0" v-model="r"/>
			<span>绿色:</span>
			<input  type="number" min="0"  v-model="g"/>
			<span>蓝色:</span>
			<input  type="number" min="0"  v-model="b"/>
			<span>宽:</span>
			<input  type="number"  min="0" v-model="w"/>
			<span>高:</span>
			<input  type="number" min="0"  v-model="h"/>
			<hr>
			<!-- 在属性中  : 表示 v-bind 属性绑定 -->
			<!-- 在js中{}表示对象  :  属性后的 -->
			<!--  :style="{backgroundColor: `rgd(${r},${g},${b})`};" 表示:给style 绑定了样式,绑定内容是个对象
				backgroundColor  :背景颜色
				当前的样式中包含
			-->
			<div :style="{'background-color': rgb,'width': `${w}`+'px','height':`${h}`+'px'}">
				{{rgb}}
			</div>
		</div>
	</body>
	<script>
		const cm = new Vue({
			el: '#app',
			data: {
				// 红色
				r:0,
				// 绿色
				g:0,
				// 蓝色
				b:0,
				// 宽
				w:500,
				// 高:
				h:100,
			},
			methods:{
				
			},
			/**
			 * 所有的计算属性都需要放到  computed 节点之下
			 * 计算属性在定义的时候,要定义成“方法格式”
			 * 
			 */
			computed:{
				/**
				 * rgb 作为一个计算属性, rgb  被定义成了方法格式
				 * 最终,在方法中,要返回一个生成好的  rgb(x,x,x) 的字符串
				 */
				rgb(){
					
					return`rgb(${this.r},${this.g},${this.b})`
				},
			},			
		})
	</script>
</html>

特点:

1、定义的时候,要被定义为方法;

2、在使用计算属性的时候,当普通属性使用即可;

好处:

1、实现了代码的复用

2、只要计算的属性中依赖的数据源变化了,他都会自动的重新求职;


四、vue-cli

 1、什么是单页面应用程序

单页面应用程序(Single Page Application)简称SPA ,顾明思议,指的是一个  web 网站中只有唯一的一个  HTML 页面,所有的功能与交互都在这唯一的一个页面内完成。

2、什么是  vue-cli

vue-cli 是 vue.js  开发的标准工具。简化了程序员基于  webpack  创建工程化的 Vue 项目的过程。

引用自 vue-cli 官网的一句话:

程序员可以专注撰写应用上,而不必花好几天去纠结  webpack 配置的问题。

中文官网:Vue.js - 渐进式 JavaScript 框架 | Vue.js

3、安装和使用

vue-cli 是 npm 上的一个全局包,使用 npm  install 命令,即可方便的吧它安装到自己的电脑上

npm install  -g @vue/cli
# 安装 vue-cli
 npm install --global vue-cli  -->这是2.0版本
 npm install --global @vue/cli  -->版本为3.0的

基于 vue-cli 快速生成工程化的Vue项目:

#vue 2.0版本创建脚手架==============================
vue init webpack vue-obj (注意名字命名)
vue init webpack +命名(最好用vue-obj  2.0)
 
#vue 3.0版本创建脚手架===============================
Vue create vue-obj  (3.0以上的)

4、卸载vue

# 运行下面的命令来卸载vue.js:

npm uninstall vue-cli -g

# 卸载之前版本

npm uninstall vue-cli -g



# 安装最新版本
npm install -g @vue/cli

5、vue-cli 的使用

第一步、

#vue 2.0版本创建脚手架==============================
vue init webpack vue-obj (注意名字命名)
vue init webpack +命名(最好用vue-obj  2.0)
 
#vue 3.0版本创建脚手架===============================
Vue create vue-obj  (3.0以上的)

第二步、

上下键进行选择

 第三步、

打着学星号的是必须安装;

Choose vue version:是 VUE 版本

Babel : 解决 js demo

TypeScript : TS

Progressive Web App (PWA) Support:渐进式框架

Router:路由

Vuex:

CSS Pre-processors: CSS预处理器

Linter / Formatter:默认选中,约束代码风格,一般不用

Unit  Testing: 单月测试

E2E Testing:测试

(初学建议安装如下) 

第四步:选择Vue版本

 第五步:选择 CSS预处理器(less)

 第六步:询问配置文件放置位置

默认第一项

第二项:是所有的配置都放到 package.json 中

 

第七步骤:设置预设(下次创建项目会按照这个模板进行创建)

 选择  y 则需要进行取名

创建成功

 

运行


6、项目

启动项目的命令是  server,在文件  package.json 文件中可以看到打包和启动项目的命令

 1、项目构成图:

2、vue项目中 src 目录的构成

assets  文件夹,存放项目中用到的静态资源文件,例如css样式表,图片资源等;

components 文件夹:程序员封装的,可复用的组件,都要放到 components 目录下;

 main.js 是项目的入口文件,整个项目的运行,要先执行 main.js ;

App.vue  是项目木的根组件;

3、vue 的运行流程

在工程话的项目中,vue要做的事情很单纯:通过 main.js App.vue  渲染到  index.html。html 的指定区域中。

main.js:

//导入 vue包,得到 Vue 构造函数
import Vue from 'vue'
//导入 App.vue  根组件,将来要把 App.vue 中的模板结构,渲染到  HTML 页面中
import App from './App.vue'

Vue.config.productionTip = false

// 常见 vue 的实例对象
new Vue({
  // 把 render 函数指定的组件,渲染到 HTML 页面中
  render: h => h(App),
// $mount('#app') 和 el:'#app' 效果一样
}).$mount('#app')
// vue 实例中的 $mount() 作用和el 属性完全一样
  1.  App.vue 用来别写带渲染的模板结构
  2. index.html 中需要预留一个 el 区域;
  3. main.js App.vue  渲染到了 index.html  所预留的区域中;
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Vue 中 $mount 测试</title>
		<script src="../../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			{{message}}
		</div>
		<div id="app2">
			{{message}}
		</div>
	</body>
	<script>
		const cm = new Vue({
			data: {
				message:'ABC',
			}
		})
		cm.$mount('#app')
		
		const cm2 = new Vue({
			el:'#app2',
			data: {
				message:'DEF',
			}
		})
	</script>
</html>


五、vue 组件

1、什么是组件化开发

组件化开发指的是:根据封装的思想,把页面上可重用的UI结构封装为组件,从而方便项目的开发和维护

2、vue 中的组件化开发

vue 是一个支持组件化开发的前端框架。

vue  中规定:组件的后缀名是.vue 。 之前接触到的App.vue  文件本质上就是一个  vue  的组件。

3、vue 组件的三个组成部分

每一个  .vue 组件都由3部分构成,分别是:

  • template  --> 组件的  模板结构
  • script  --> 组件的   JavaScript 行为
  • style    --> 组件的  样式
<template>
  <div  class="test_box">
    <span>{{user_name}}</span>
    <button @click="changeName">确定</button>

  </div>
</template>

<script>
  //<!--   默认导出,这是固定写法-->
  export default {
    name: "demo_test",
    // data 数据源
    // 注意 vue 组件中的  data 不能像之前一样,不能指向对象。
    // 注意: 组件中的 data 必须是一个函数
    data(){
      //这个return 出去的 {} 中,可以定义数据
      return {
        user_name:'张三',
      }
    },
  //方法函数区
    methods:{
      changeName(){
        /**
         * 在组件中  this 就表示当前实例的对象
         */
        console.log(this)
        this.user_name='李四'
      }
    },
  //  当前组件中的侦听器
    watch:{},
  // 当前组件中的计算属性
    computed:{},
  // 当前组件中在过滤器
    filters:{},
  }
</script>

<style scoped>
  .test_box{
    background-color: coral;
  }

</style>





//如果需要使用到  这样的样式结构  需要在  style 后加上  lang="less" 属性
<style scoped lang="less">
  .test_box{
    background-color: coral;
    span {
      color: red;
    }
  }

</style>

 

 

注意:

1、 在 template  中只能存在唯一个根节点,也就是在  template 中所有的内容都要放在一个<div></div>中;

2、在style  标签中如果不加  lang="less" 属性 默认则是 CSS语法,需要启用 less 语法就增加lang="less"属性;


六、axios

axios  是一个 专注于网络数据请求 的库!

1、axios 基础语法

2、通过 axios 请求返回的数据结构如下图

	const result = axios({
			method:'GET',
			url:"http://www.liulongbin.top:3006/api/getbooks"
		})
		result.then(function(datas){
			console.log(datas)
		})
axios({
			method:'GET',
			url:"http://www.liulongbin.top:3006/api/getbooks"
		}).then(function(result){
			console.log(result)
		})

3、GET

传参:

await axios({
	method:'GET',
	url:"http://www.liulongbin.top:3006/api/getbooks",
	// GET 参数: URL 中的查询参数
	params:{
			id:1
	},
	// POST 参数
	data:{},
	}).then(function(result){
		console.log(result)
})

1、如果用的是GET 请求那么使用  params 进行传参;

2、如果用的是 POST 请求那么使用  data 进行传参;

可以根据需求进行选择。

 4、POST

axios({
	method:'POST',
	url:"http://www.liulongbin.top:3006/api/post",
	// POST 参数
	data:{
	   name:'zs',
	   age:'20'
	},
	}).then(function(result){
	     console.log(result)
})

5、await 

 1、如果调用某一个方法的返回值是 promise 实例,则前面可以添加  await 

2、await  只能用在被  async  “修饰” 的  方法中

async fun_01() {
	// 如果调用某一个方法的返回值是 promise 实例,则前面可以添加  await  
	await axios({
		method: 'POST',
		url: "http://www.liulongbin.top:3006/api/post",
		// POST 参数
		data: {
			name: 'zs',
			age: '20'
		},
		}).then(function(result) {
				console.log(result)
		})
}


async fun_01() {await axios({
	method: 'POST',
	url: "http://www.liulongbin.top:3006/api/post",
	// POST 参数
	data: {
	    name: 'zs',
		age: '20'
	},
	}).then(function(result) {
			console.log(result)
	})
}

                                                                  

 获取 data 中真实的数据

async fun_02() {
		// 结构赋值的时候 ,使用 :  进行重命名
        /**
        * 1、调用 axios 之后,使用  async/await 进行简化
        * 2、使用结构赋值,从  axios  封装的大对象中,把 data  属性结构出来
        * 3、吧结构出来的 data 属性,使用,冒号 进行重命名,一般重命名为 res
        */
		const { data:res } = await axios({
		method: 'POST',
		url: "http://www.liulongbin.top:3006/api/post",
		// POST 参数
		data: {
		    name: 'zs',
			age: '20'
		},
		})
		console.log(res)
},
				

 6、 axios.get

// ==================  axios.get =============
async fun_03() {
	const {data : res} = await axios.get('http://www.liulongbin.top:3006/api/getbooks')
	console.log(res)
},
// 传参
async fun_04() {
	const {data : res} = await axios.get('http://www.liulongbin.top:3006/api/getbooks',{
				params:{
					id:1
				}
		})
	console.log(res)
},

7、axios.post

async fun_05() {
	const {data : res} = await axios.post('http://www.liulongbin.top:3006/api/post',
	{
		name:'zs',
		gender:'女'
	},
	)
	console.log(res)
},


总结

1、侦听器

需要试听那个数据就将其名称定义为函数名;

函数形式的侦听器看不会一进入页面就会被侦听到需要将其改为对象的形式。

 deep 选项  侦听对象中的所有属性变化

 侦听对象中的某一个属性的变化;

2、计算属性

3、vue-cli

1、安装node.js

Node.js

2、安装 vue-cli

        npm install  -g  @vue/cli

        -g  表示全局安装

3、创建vue项目

        vue   create   项目名称

4、vue项目构成

5、vue 项目启动

        npm  run   serve

4、vue 组件

每一个  .vue  组件都由3部分组成,分别是:

  • template   组件的模板结构
  • script    组件的  JavaScript  行为
  • style     组件的样式

其中style  中需要加上一个  lang='less'

数据需要定义到data节点的return 中,data是一个函数

 export default {
        data(){
            //这个return 出去的 {} 中,可以定义数据
            return {
                user_name:'张三',

            }
        }
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值