Vue和ES6基础

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44692896/article/details/102749720

ES6

三个定义变量命令
var:在过去Js定义变量只有一个关键字:var,var有一个问题,就是定义的变量有时会莫名奇妙的成为全局变量 
let:定义局部变量,只有在let命令所在的代码块内有效。 
const:定义常量,不能被修改。
ES6解构表达式

定义的一个person对象:

const person = {
    	name:"jack",
    	age:21,
    	language: ['java','js','css']
	}

使用解构表达式:

const {name,age,language} = person;
	//打印
	console.log(name);
	console.log(age);
	console.log(language);
ES6箭头函数
//无参箭头函数
var print = function () {
   	 console.log(1);
	}
var print = () => console.log(1);
------------------------------------
//带参箭头函数
var print = function (a) {
   	 console.log(a);
}
var print = a => console.log(a);

Vue

MVVN

Vue框架特点:MVVM模式
•M:即Model,模型,包括数据和一些基本操作
•V:即View,视图,页面渲染结果
•VM:即View-Model,模型与视图间的双向操作(无需开发人员干涉)

vue实例
var  vm  =  new Vue({
	el:’#父容器id’,	//element的简写
	data:{			//data专门用来存放数据
		属性名:“属性值”,
		属性名:“属性值”,
		属性名:“属性值”
		......
	},
	methods:{		//自定义函数
		函数名(){
		方法体
		},
		......
	},
	beforeCreate(){   //初始化前调用的函数
		方法体
	},
	created(){       //初始化完成调用的函数
		方法体
	},
	beforeMount(){	//双向数据绑定前调用的函数
		方法体
	},
	Mounted(){		//双向数据绑定完成调用的函数
		方法体
	},
	beforeUpdate(){	//更新前调用的函数
		方法体
	},
	updated(){		//更新完成调用的函数
		方法体
	},
	beforeDestroy(){	//销毁前调用的函数
		方法体
	},
	destroyed(){		//销毁完成调用的函数
		方法体
	},
	computed:{		//计算属性,本质是方法,用的时候是属性,必须有返回值
		函数名(){
			Return 返回值
		}
	}
})
指令

三个指令
双向数据绑定指令:v-model
v-bind:属性名(可以使用:省略v-bind)
v-on:事件名(可以使用@省略v-on)

Checkbox案例
<div id="app">
   	 	<input type="checkbox" v-model="language" value="Java" />Java<br/>
    	<input type="checkbox" v-model="language" value="PHP" />PHP<br/>
    	<input type="checkbox" v-model="language" value="Swift" />Swift<br/>
   		<h1>
        	你选择了:{{language.join(',')}}
    	</h1>
	</div>
	<script src="./node_modules/vue/dist/vue.js"></script>
	<script type="text/javascript">
    	var vm = new Vue({
        	el:"#app",
        	data:{
            	language: []
        	}
    	})
	</script>
•多个CheckBox对应一个model时,model的类型是一个数组,单个checkbox值是boolean类型
•radio对应的值是input的value值
•input 和textarea 默认对应的model是字符串
•select单选对应字符串,多选对应也是数组
修饰符
事件修饰符:
.stop 阻止冒泡事件
.prevent 阻止默认事件 主要用在a标签中
.capture 捕获
.self 只点自己身上才运行
.once 只执行一次

按键修饰符:
.enter  // 表示键盘的enter键
	.tab
	.delete (捕获 "删除" 和 "退格" 键)
	.esc
	.space
	.up
	.down
	.left
	.right
	.ctrl
	.alt
	.shift
	.meta

阻止默认行为函数:event.preventDefault()
阻止冒泡行为函数:event.stopPropagation()
v-if和v-show区别
v-if:移除元素
v-show:只是简单的加display:none
v-for
语法1:
v-for="item in items"
–items:要遍历的数组,需要在vue的data中定义好。
–item:迭代得到的数组元素的别名


语法2:
v-for="(item,index) in items"
–items:要迭代的数组
–item:迭代得到的数组元素别名
–index:迭代到的当前元素索引,从0开始。
Axios
axios.get(url).then(res(响应的对象) =>{
	axios请求成功后,处理逻辑
	} ).catch(error => {
	接口或处理逻辑出错
})
组件

定义全局组件,组件也是一个Vue实例,全局组件意味着无论是否使用这个组件,依然会随着Vue的加载而加载

Vue.component(组件名称,{
	//vue对象
	template:`定义html`//必须有根元素 例:div、table...
	data(){				//子组件data必须定义为方法
		Return{
			属性名:属性值
		}
	}......
		其余基本一样
})

定义局部组件/局部注册

const counter = {
    	template:'<button v-on:click="count++">点击 {{ count }} </button>',
    	data(){
        	return {
            	count:0
        	}
    	}
	};

然后在Vue中使用它–注册局部组件:

var app = new Vue({
    	el:"#app",
    	components:{
        	// counter:counter // 将定义的对象注册为组件
    		counter
    	}
	})
•components就是当前vue对象子组件集合。
	–其key就是子组件名称
	–其值就是组件对象的属性
•效果与刚才的全局注册是类似的,不同的是,这个counter组件只能在当前的Vue实例中使用
•子组件的在html中直接使用<组件名>即可使用
组件通信

父向子传递props
父组件使用子组件,同时传递title属性:

<script src="../vue-2.6.10.js"></script>
	<div id="app">
   		 <h1>打个招呼:</h1>
    	<!--使用子组件,同时传递title属性-->
    	<introduce title="大家好,我是奥特曼"/>
	</div>

	<script type="text/javascript">
 	//子组件
Vue.component("introduce",{
    	// 直接使用props接收到的属性来渲染页面
    	template:'<h3>{{title}}</h3>',
    	props:['title'] // 通过props来接收一个父组件传递的属性
	})
//父组件
    var app = new Vue({
        el:"#app"
    })
</script>
props:[‘属性1,’属性2,...]  //可以定义多个属性接收父组件数据
传值过程

在这里插入图片描述
子向父的通信

<!DOCTYPE html>
	<html lang="en">
	<head>
    	<meta charset="UTF-8">
    	<title>Title</title>
    	<script src="../vue-2.6.10.js"></script>
	</head>
	<body>
	<div id="app">
    	outNum:{{outNum}}<br>
		<counter @outshow1="mainshow1"></counter>
    	<counter @outshow2="mainshow2"></counter>
	</div>
	<script>
	Vue.component("counter",{
		template:`<div>
					<button @click="show1()">show</button>//无参
					<button @click="show2(10)">show</button>, //有参
				  </div>`, 
		methods:{
			//无参
			show1(){
            	this.$emit("outshow1")
        	},
			//有参
        	show2(num){
            	this.$emit("outshow2",num)
        	}
    	}
	})


	var vm = new Vue({
    	el:"#app",
    	data:{
        	outNum:''
    	},
    	methods:{
		//无参
		mainshow1(){
            	this.outNum = 10
        	},
		//有参
        mainshow2(myoutnum){
            	this.outNum = myoutnum
        	}
    	}
	});
	</script>
	</body>
	</html>

流程分析
在这里插入图片描述

跨域

跨域是指跨域名的访问,以下情况都属于跨域:

扫描二维码关注公众号,回复: 7608066 查看本文章
跨域原因说明							示例
域名不同						www.jd.com 与 www.taobao.com
域名相同,端口不同			www.jd.com:8080 与 www.jd.com:8081
二级域名不同/子域名不同		item.jd.com 与 miaosha.jd.com
协议不同						http://jd.com与https://jd.com
域名和ip地址					http://jd.com与192.168.23.12
为什么会有跨域问题?
浏览器的同源策略引起跨域问题,因为跨域问题是浏览器对于ajax请求的一种安全限制
一个页面发起的ajax请求,只能是于当前页同域名的路径/**,这能有效的阻止跨站攻击。
如何解决跨域问题
•Jsonp
 最早的解决方案,利用script标签(不受限)可以跨域的原理实现。
 限制:
–需要服务的支持
–只能发起GET请求
•nginx反向代理
 思路是:利用nginx反向代理把跨域为不跨域,支持各种请求方式
•CORS
 规范化的跨域请求解决方案,安全可靠。是w3c组织的标准
 优势:
–在服务端进行控制是否允许跨域,可自定义规则
–支持各种请求方式:get、post、put、delete
–限制访问的电脑的IP地址
 缺点:
–会产生额外的请求(可能发一次/二次请求)
什么是CORS
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
•浏览器端:
 	目前,所有浏览器都支持该功能(IE10以下不行)。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。
•服务端:
 	一般通过过滤器完成功能。
服务端解决跨域问题
//方式一
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class GlobalCorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        //1.添加CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //1) 允许的域,不要写*,否则cookie就无法使用了
        config.addAllowedOrigin("http://localhost:8094");
        //2) 是否发送Cookie信息
        config.setAllowCredentials(true);
        //3) 允许的请求方式
        config.addAllowedMethod("OPTIONS");
        config.addAllowedMethod("HEAD");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("DELETE");
        config.addAllowedMethod("PATCH");
        // 4)允许的头信息
        config.addAllowedHeader("*");

        //2.添加映射路径,我们拦截一切请求
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);

        //3.返回新的CorsFilter.
        return new CorsFilter(configSource);
    }
}
方式二
	在controller类上加@CrossOrigin注解

猜你喜欢

转载自blog.csdn.net/qq_44692896/article/details/102749720