概述:Vue是一款前端渐进式框架,可以提高前端开发效率。
特点:
Vue通过MVVM模式,能够实现视图与模型的双向绑定。
简单来说,就是数据变化的时候, 页面会自动刷新, 页面变化的时候,数据也会自动变化.
概述:Vue是一个类似于Jquery的一个JS框架,所以,如果想使用Vue,则在当前页面导入Vue.js文件即可。
语法:
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
<script src="https://cdn.jsdelivr.net/npm/vue">script>
<script src="node_modules/vue/dist/vue.js">script>
案例
用户名:
您输入的用户名是: {
{name}}
**概述:**钩子函数, 其实就是Vue提前定义好的事件, 其作用类似于Servlet的init方法和distory方法
语法:
<script type="text/javascript">
var app = new Vue({
el:"#app",
//钩子函数created,该方法在页面显示之后,自动执行
created() {
console.log("created...");
}
});
script>
补充:Vue声明周期和钩子函数
**概述:**插值表达式用户把vue中所定义的数据,显示在页面上. 插值表达式允许用户输入"JS代码片段"
语法:{ { 变量名/对象.属性名 }}
案例:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue插值表达式title>
<script src="node_modules/vue/dist/vue.js">script>
head>
<body>
<div id="app">
<h1>欢迎来到-->{
{ name }}h1>
div>
<script type="text/javascript">
//创建vue对象
var app = new Vue({
//让vue接管div标签
el:"#app",
//定义数据,里边包含一个属性name,值为"黑马"
data:{
name:"黑马"
}
});
script>
body>
html>
概述:
v-text和v-html专门用来展示数据, 其作用和插值表达式类似。v-text和v-html可以避免插值闪烁问题.
当网速比较慢时, 使用{ {}}来展示数据, 有可能会产生插值闪烁问题。
插值闪烁: 在数据未加载完成时,页面会显示出原始的{ {}}, 过一会才会展示正常数据.
语法:
v-text:<span v-text="msg">span>
v-html:<span v-html="msg">span>
区别:
v-text:把数据当作纯文本显示.
v-html:遇到html标签,会正常解析
概述:
Vue的双向绑定可以实现: 数据变化的时候, 页面会自动刷新, 页面变化的时候,数据也会自动变化.
注意:
代码:
<div id="app">
用户名: <input type="text" v-model="username"/>
div>
<script type="text/javascript">
var app = new Vue({
el:"#app",
data:{
//该属性值和文本框的value属性值,保持一致
username:""
}
});
script>
效果:
代码:
<div id="app">
<input type="checkbox" v-model="agree">同意<br>
div>
<script type="text/javascript">
var app = new Vue({
el:"#app",
data:{
agree:true
}
});
script>
代码:
<div id="app">
<input type="checkbox" value="Java" v-model="language">Java<br>
<input type="checkbox" value="Python" v-model="language">Python<br>
<input type="checkbox" value="Swift" v-model="language">Swift<br>
div>
<script type="text/javascript">
var app = new Vue({
el:"#app",
data:{
//数组中的值,就是被选中的元素的value属性值
language:["Java","Python"]
}
});
script>
效果:
概述:
Vue中也可以给页面元素绑定事件.
语法:
<button v-on:事件名="函数名/vue表达式">点我button>
<button @事件名="函数名/vue表达式">点我button>
注意:
Vue支持html中所有已知事件. 如: @click, @submit等, 只不过事件的名字不带on
案例:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue事件处理title>
<script src="node_modules/vue/dist/vue.js">script>
head>
<body>
<div id="app">
<button @click="show">点我button>
div>
<script type="text/javascript">
//创建vue对象
var app = new Vue({
//获取id为app的元素,该元素被vue对象所管理.只有被vue对象管理的标签,其内部才允许书写vue语法
el:"#app",
//定义vue的方法
methods:{
//定义show方法,弹出提示框
show() {
alert("Hello Vue!!!");
}
}
});
script>
body>
html>
**概述:**事件修饰符主要对事件的发生范围进行限定
语法:
<button @事件名.事件修饰符="函数名/vue表达式">点我button>
分类:
.stop :阻止事件冒泡, 也就是当前元素发生事件,但当前元素的父元素不发生该事件
.prevent :阻止默认事件发生
.capture :使用事件捕获模式, 主动获取子元素发生事件, 把获取到的事件当自己的事件执行
.self :只有元素自身触发事件才执行。(冒泡或捕获的都不执行)
.once :只执行一次
案例:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>vue事件处理title>
<script src="node_modules/vue/dist/vue.js">script>
head>
<body>
<div id="app">
<button @click="show">点我button>
div>
<script type="text/javascript">
//创建vue对象
var app = new Vue({
//获取id为app的元素,该元素被vue对象所管理.只有被vue对象管理的标签,其内部才允许书写vue语法
el:"#app",
//定义vue的方法
methods:{
//定义show方法,弹出提示框
show() {
alert("Hello Vue!!!");
}
}
});
script>
body>
html>
语法:
v-for="item in items"
v-for="(item,index) in items"
items:要迭代的数组
item:存储数组元素的变量名
index:迭代到的当前元素索引,从0开始。
代码:
<div id="app">
<ul>
<li v-for="(user, index) in users">
{
{index}}--{
{user.name}}--{
{user.age}}--{
{user.gender}}
li>
ul>
div>
<script>
var app = new Vue({
el:"#app",//el即element,要渲染的页面元素
data: {
users:[
{
"name":"黑马","age":8,"gender":"男"},
{
"name":"传智播客","age":12,"gender":"女"},
{
"name":"酷丁鱼","age":4,"gender":"男"}
]
}
});
script>
语法:
v-for="value in object"
v-for="(value,key) in object"
v-for="(value,key,index) in object"
value,对象的值
key, 对象的键
index, 索引,从0开始
代码:
<div id="app">
<ul>
<li v-for="(value,key,index) in person">
{
{index}}--{
{key}}--{
{value}}
li>
ul>
div>
<script>
var app = new Vue({
el:"#app",//el即element,要渲染的页面元素
data: {
person:{
"name":"传智汇", "age":3, "address":"中国"}
}
});
script>
概述:
:key 一般配合v-for一起使用. 用来在特定情况下, 保证被遍历的数组中的元素的顺序.
案例:
<div id="app">
<button @click="add">添加button>
<ul>
<li v-for="name in list">
<input type="checkbox"> {
{name}}
li>
ul>
div>
<script>
var app = new Vue({
el: '#app',
data: {
list: ["孙悟空", "猪八戒", "沙和尚"]
},
methods: {
add() {
//注意这里是unshift,向数组的头部添加一个元素
this.list.unshift("唐僧");
}
}
});
script>
<div id="app">
<button @click="add">添加button>
<ul>
<li v-for="name in list" :key="name">
<input type="checkbox"> {
{name}}
li>
ul>
div>
概述:
v-if与v-show可以根据条件的结果,来决定是否显示指定内容.
v-if: 条件不满足时, 元素不会存在.
v-show: 条件不满足时, 元素不会显示(但仍然存在).
案例:
<div id="app">
<button @click="show = !show">点我button>
<h1 v-if="show">Hello v-if.h1>
<h1 v-show="show">Hello v-show.h1>
div>
<script>
var app = new Vue({
el:"#app",
data: {
show:true
}
});
script>
概述:
v-bind的作用和插值表达式差不多, 只不过, v-bind主要用于动态设置标签的属性值
语法:
<标签名 v-bind:标签属性名="vue实例中的数据属性名"/>
<标签名 :标签属性名="vue实例中的数据属性名"/>
案例:
<div id="app">
<input type="button" :value="msg"/>
div>
<script type="text/javascript">
var app = new Vue({
el:"#app",
data:{
msg:"我是按钮"
}
});
script>
概述:
计算属性, 其实就是把一个提前定义好的方法,当属性来使用.
该方法可以看作是一个特殊的值, 可以在插值表达式中直接使用.
语法:
var app = new Vue({
el:"#app",
//计算属性必须放在Vue的computed中
computed:{
//定义计算属性
属性名(){
return "返回值";
}
}
});
案例::
<div id="app">
<h1>{
{birth}}h1>
<h1 v-text="birth">h1>
<h1 v-html="birth">h1>
div>
<script type="text/javascript">
var app = new Vue({
el:"#app",
computed:{
//定义一个birth方法,该方法就是一个计算属性,可以在插值表达式中使用
birth(){
let date = new Date();
let year = date.getFullYear();
let month = date.getMonth()+1;
let day = date.getDay();
return year + "-" + month + "-" + day;
}
}
});
script>
概述:
watch可以监听简单属性值及其对象中属性值的变化.
watch类似于onchange事件,可以在属性值修改的时候,执行某些操作.
语法:
var app = new Vue({
el:"#app",
data:{
message:"test",
person:{
"name":"test", "age":13}
},
//watch监听
watch:{
//监听message属性值,newValue代表新值,oldValue代表旧值
message(newValue, oldValue){
console.log("新值:" + newValue + ";旧值:" + oldValue);
},
//监控person对象的值,对象的监控只能获取新值
person: {
//开启深度监控;监控对象中的属性值变化
deep: true,
//获取到对象的最新属性数据(obj代表新对象)
handler(obj){
console.log("name = " + obj.name + "; age=" + obj.age);
}
}
}
});
概述:
组件, 类似于模版, 模块. 在项目需要重用某个模块(头部、尾部、新闻。。。)的时候,可以将模块抽取成组件,其它页面中注册组件并引用。
案例:
<div id="app">
<counter>counter>
<counter>counter>
div>
<script type="text/javascript">
//定义组件
const counterTemp = {
//定义组件的模版
template:``,
//定义组件中使用到的数据属性
data(){
return {
num:0
}
}
};
//全局注册组件:在所有的vue实例中都可以使用组件
//参数1:组件名称,参数2:具体的组件
//Vue.component("counter", counterTemp);
var app = new Vue({
el:"#app",
//局部注册组件: 只能在当前Vue实例中使用
components:{
//组件名称:具体组件
counter: counterTemp
}
});
script>
注意:
- 组件的模版中, 只能书写一个跟标签
- 组件的定义必须放在Vue创建对象之前, 否则报错
概述:
所谓的父组件向子组件通讯, 其实就是实现"子组件中能够使用父组件中的数据"
而子组件无法直接使用父组件中的数据, 如果需要使用, 则必须由父组件把数据传递给子组件才可以.
实现原理:
把父组件中的数据, 赋值给子组件的属性, 在子组件中使用属性, 即可获取父组件中的数据
示例:
<div id="app">
<aaa :number="count" :ids="arr" :person="p">aaa>
div>
<script>
var aaa = {
//定义组件的模版
template: `{
{number}}--{
{ids}}--{
{person}}
`,
//给组件添加属性
props: {
//普通属性number
number: "",
//数组属性ids
ids: [],
//对象属性person
person: {
}
/*
* //以上属性还可以书写为以下格式
* person:{
* //数据类型,如果是数组则是Array,如果是对象则是Object
* type:Object,
* //默认值
* default:{}
* }
*/
}
};
//注册:全局注册
Vue.component("aaa", aaa);
var app = new Vue({
el: "#app",
data: {
count: 5,
arr: [1, 2, 3],
p: {
username: "zhangsan", age: 23}
}
});
script>
概述:
所谓的子组件向父组件通信, 其实就是实现"子组件中能够调用父组件中的方法"
而同样, 子组件无法直接使用调用父组件中的方法, 如果需要使用, 则也必须把方法传递到子组件中的属性中
意义:
把父组件中的方法, 传递给子组件的属性, 然后在子组件中直接使用这个属性, 即可调用对应方法
完整写法:
<div id="app">
<h2>引用模版h2>
<bttmpl @show="app_show">bttmpl>
div>
<script>
//定义模版(组件)
var bttmpl = {
template: ``,
methods:{
aaa(){
return this.$emit("show"); //this.$emit("show"): 让子组件中的show方法执行
}
},
props:{
show:function(){
} //定义一个属性,属性名字叫"show",用来存储父组件传递过来的方法
}
}
var app = new Vue({
el: "#app",
//局部注册
components: {
bttmpl
},
methods:{
app_show(){
alert("app_show...");
}
}
});
script>
简化写法:
<div id="app">
<h2>引用模版h2>
<bttmpl :show="app_show">bttmpl>
div>
<script>
//定义模版(组件)
var bttmpl = {
template: ``,
props:{
show:function(){
}
}
}
var app = new Vue({
el: "#app",
//局部注册
components: {
bttmpl
},
methods:{
app_show(){
alert("app_show...");
}
}
});
script>
概述:
axios是一个基于 promise 的 HTTP 库, 主要用于:发送异步请求获取数据。
常见的方法:
axios(config)
axios.get(url, [config])
axios.post(url, [data], [config])
发送数据config常用参数:
{
url: '请求的服务器',
method: '请求方式', // 默认是 get
// GET请求参数
params: {
参数名: 参数值
},
// POST请求参数, 如果使用axios.post,则参数在url之后直接书写,不需要该位置传递参数
data: {
参数名: 参数值
},
// 响应数据格式,默认json
responseType: 'json'
}
响应数据常用参数:
{
data: {
}, //真正的响应数据(响应体)
status: 200, //响应状态码
statusText: 'OK', //响应状态描述
headers: {
}, //响应头
config: {
} //其他配置信息
}
var app = new Vue({
el: "#app",
data: {
user: {
}
},
//当页面加载完毕后
created() {
//发送GET请求axios.get("请求路径",{ config });
axios.get("请求路径",{
//get请求参数
params: {
name:"zhangsan",
age:23
},
//响应数据格式为"json"
responseType: 'json'
}).then(res => {
//打印响应数据
console.log(res);
//把响应数据赋值给Vue中的user属性
app.user = res.data;
}).catch(err => {
//打印响应数据(错误信息)
console.log(err);
});
}
});
var app = new Vue({
el: "#app",
data: {
user: {
}
},
//当页面加载完毕后
created() {
//发送POST请求axios.post("请求路径",{ 参数 });
axios.post("请求路径",{
name:"zhangsan",
age:23
}).then(res => {
console.log(res);
app.user = res.data;
}).catch(err => {
console.log(err);
});
}
});
跨域请求:在前端js中如果发送异步请求的话,请求的地址与当前服务器的ip或者端口号不同都是跨域请求.