2021-12-15  2021-12-15    3812 字   8 分钟

一、ES6

1. 理解

	ECMAScript 6.0 是JavaScript新的语法给JS补充了一些新语法Vue基于ES6的新语法

2. 新特性

① 声明变量
语法
    let 变量名 = 初始值;

特点
    1. let声明的变量提供了局部作用域
    2. let声明变量的名字 只能声明一次
    3. let声明变量必须给初始值
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // 1. 声明变量 var 声明的变量没有局部作用域
        var i = 10

        // 2. es6  let声明的变量提供了局部作用域
        let j = 10
        console.log(j)
        console.log("----------------------")
        {
            var n = 11
            let m = 12
        }
        console.log(n)
        // console.log(m)  // Uncaught ReferenceError: m is not defined
        console.log("---------------")


        // let声明变量的名字 只能声明一次
        var i = 19

        // let j = 20  
        console.log(i)
        // console.log(j) // Uncaught SyntaxError: Identifier 'j' has already been declared

        console.log("---------------------")
        console.log(xx);  // undefined
        var xx = "app";

        // let声明变量必须给初始值
        console.log(yy)
        let yy = "apps"  // Uncaught ReferenceError: Cannot access 'yy' before initialization
    </script>
</head>
<body>
    
</body>
</html>
② 常量的声明
格式
    const 常量名 = 初始值
特点
    1. 常量一经定义 不能改变值 否则报错
   	2. 常量必须给初始值  否则报错
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // es6 声明常量
        const PI = 3.1415926
        // PI = 3.14 // Uncaught TypeError: Assignment to constant variable.
        console.log(PI)

        const P  // Uncaught SyntaxError: Missing initializer in const declaration
        console.log(p)
    </script>
</head>
<body>
    
</body>
</html>
③ 解构赋值
1. 理解
	解构赋值对赋值运算符的扩展主要对数组和对象中的变量匹配赋值更加简单易读语义更加清晰
 // 传统方式
var i=1, j=2, a=3
    console.log(i, j, a)

    // es6
    let[b, c, d] = [2, 3, 4]
    console.log(b, c, d)

    // 对象
    var user = {name: "huahua", age: 18}
// 传统
var username = user.name
    var age1 = user.age
    console.log(username, age1)

    // es6
    let{name, age} = user
    console.log(name, age)
④ 模板字符串
1. 理解
    模板字符串相当于加强版的字符串使用`(反引号)可以获取普通字符变量和表达式的值
var num = 10
        // 传统
        var name = "翠花"
        var str = "hi, "+name+"。 你好"
        var ss = "hi, "+name+"。"+say()+(num+1)
        console.log(ss)

        // es6
        var str1 = `hi, ${name}你好啊`
        var sss = `hi, ${name}${say()} ${num+1}`
        console.log(sss)


        function say(){
            return "么么哒"
        }
⑤ 对象声明简化
// 传统 对象声明
var name = "xx"
    var age = 18
    var p = {name: name, age: age}
console.log(p)
    // es6 
    let pp = {name, age}
console.log(pp)
⑥ 声明函数简化
// 传统
var user1 = {
    username: "aa",
    age: 19,
    say: function(){
        console.log(".......")
    }
}
user1.say()

    // es6
    var user2 = {
    username: "aa",
    age: 19,
    say(){
        console.log("...es6....")
    }
}

user2.say()
⑦ 函数默认值参数
 //es6 默认值参数
function sayHi(name, age=18){
    console.log(name+"::"+age)
}

sayHi("xx", 22)
    sayHi("xx")
    sayHi("xx", null)
⑧ 函数的不定参数
// es6 函数不定参数
        function eat(...v){
            console.log(v.length)
        }

        eat(1, "哈哈", null, 3.14)
⑨ 箭头函数
箭头函数就是函数简洁的一种写法
特点
    1. 函数中无参或者多参数  ()不能省略
    2. 函数体中如果只有 return 或者 只有一句话 {}可以省略  否则不可以
   
 // 传统方式
        var func1 = function (a){
            console.log(a)
        }

        var func3 = function(b){
            return b
        }

        // es6  类似lambda表达式
        var func2 = a => console.log(a)

        func2(10)

        var func4 = b => b
        console.log(func4(11))

二、Vue

1. 理解

 	Vue 渐进式框架 Vue只关注视图层将dom封装起来提供简单的API 实现视图和数据的绑定最大程度上释放了dom操作vue是JavaScript的一个优秀框架

2. 作用

M-V-VM模式
    M Model 模型 数据模型 
    V View  视图 将数据页面渲染的结果
    VM View-Model 视图和模型的双向绑定

3. 使用

 下载 vue.js文件
 引入页面中  <script src="js/vue.js"></script>
 编码
    1. 创建vue对象
    2. 配置Vue的选项 el data methods ...
    	el: // element, vue中模型数据要渲染的页面
	    data // 要渲染页面中的数据   后台获取
         methods// vue中需要使用的函数
    3. 定义组件 去渲染数据
         <div id="app"> 渲染 </div>
    4. 使用插值表达式 渲染data中数据  字符串数据
        {{data的属性名}}

4. Vue的指令

 	指令是带 v-前缀 的特殊的属性v-html v-show v-for v-ifVue框架扩展的语法 取代dom操作 渲染vue中data的数据
4.1 v-html和v-text
类型 innerHTML  innerText
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="app">
        <p v-html="h"></p>
        <p v-text="t"></p>
    </div>
    <script>
        let app = new Vue({
            el: "#app", 
            data: {
                h: "<font color='red'>嘿嘿</font>",
                t: "哈哈"
            }
        })
    </script>
</body>
</html>
4.2 v-if 和 v-show
 v-if 值为true显示该组件  为false移出该组件   v-else 
 v-show 值为true 显示组件   为false 设置display属性为none 不能 v-else使用
     
   <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="app">

        <h2 v-if="b">欢迎: xx</h2>
        <h2 v-else="">请登录</h2>

        <h2 v-show="b">哈哈</h2>
    </div>
    <script>
        let v = new Vue({
            el: "#app",
            data: {
                b: false
            }
        })
    </script>
</body>
</html>  
     
     
     
4.3 v-on
作用利用v-on绑定dom事件 当事件触发时执行v-on的js代码
语法
    v-on:事件名 = ""  @事件名 = ""
        
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="app">
        <button v-on:click="num++">点击{{num}}</button>
        <button v-on:click="func1()">点击{{num}}</button>
        <button @click="func2(num)">点我干啥</button>
    </div>  
    <script>
        let v = new Vue({
            el: "#app",
            data: {
                num: 0
            },
            methods: {
                func1(){
                    console.log("点击触发了:"+this.num)
                    this.num ++
                },
                func2(n){
                    console.log("func2调用了, "+n)
                }

            }
        })
    </script>
</body>
</html>
4.4 v-for
作用页面渲染列表是遍历
格式
    1. (item, index) in 数组或集合
    	item 集合或数组中每一个元素
    	index 集合或数组的索引
    2. (value, key, index) in 对象
    	value 对象中对应的属性值值
    	key   对象的属性名
    	index 对象的属性对应的索引
    
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="app">
        <table border="1" cellspacing="0" width="500" align="center">
            <tr>
                <th>索引</th>
                <th>学号</th>
                <th>姓名</th>
                <th>性别</th>
            </tr>
           <!--  1. 遍历集合 -->
            <tr v-for="(item, index) in stuList">
                <td>{{index}}</td>
                <td>{{item.sid}}</td>
                <td>{{item.username}}</td>
                <td>{{item.sex}}</td>
            </tr>
        </table>

        <form action="" method="">
            <table border="1" cellspacing="0" width="500" align="center">
                <!-- 2. 对象的遍历 -->
                <tr v-for="(v, key, index) in stu">
                    <td>{{index}}--{{key}}</td>
                    <td><input type="text" v-bind:name="key" v-model="stu[key]"></td>
                </tr>
            </table>
        </form>
    </div>
    <script>
        let v = new Vue({
            el: "#app",
            data: {
                stuList: [
                    {sid: 101, username: "小坤坤", sex: "男"},
                    {sid: 102, username: "小冲冲", sex: "未知"},
                    {sid: 103, username: "小一一", sex: "男"},
                    {sid: 104, username: "小航航", sex: "女"},
                    {sid: 105, username: "小龙龙", sex: "男"}
                ],
                stu: {sid: 106, username: "小涛涛", sex: "女"}
            }
        })
    </script>
</body>
</html>
4.5 v-bind
作用绑定标签的属性值
格式v-bind:属性名=""   :属性名=""
    
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="app">
        <img v-bind:src="src">
        <img :src="src">
        <input type="text" name="username" :value="username">
        <input type="text" :value="username">
    </div>
    <script>
        let v= new Vue({
            el: "#app",
            data: {
                src: "img/mv.png",
                username: "小美女"
            }
        })
    </script>
</body>
</html>
4.6 v-model
作用表单数据的双向绑定
特点双向绑定
    1. vue中数据发生变化 会更新到页面
    2. 页面数据变化也会更新vue中的数据
    
     <div id="app">
        <input type="text" v-model="xx">
        <input type="text" v-model="xx">
    </div>
    <script>
        let v = new Vue({
            el: "#app",
            data: {
                xx: "小明明"
            }
        })
    </script>

5. Vue的选项

el: // element, vue中模型数据要渲染的页面
data // 要渲染页面中的数据   后台获取
methods// vue中需要使用的函数
computed: // 计算属性
watch: // 监控一个值发生变化 做出相应的处理
计算属性
    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="app">
        <p>{{birthday}}</p>
        没有使用计算属性<p>{{new Date(birthday).getFullYear()+'年'+(new Date(birthday).getMonth()+1)+'月'+new Date(birthday).getDate()+'日'}}</p>
        计算属性<p>{{getBirthday}}</p>
    </div>
    <script>
        let v = new Vue({
            el: "#app",
            data: {
                xx: "小明明",
                birthday: 1610669793429
            },
            computed: {
                getBirthday(){
                    return new Date(this.birthday).getFullYear()+'年'+(new Date(this.birthday).getMonth()+1)+'月'+new Date(this.birthday).getDate()+'日'
                }
            }
        })
    </script>
</body>
</html>
监听
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="app">
        <input type="text" v-model="name" >
    </div>
    <script>
        let v = new Vue({
            el: "#app",
            data: {
                name: "小坤坤"
            },
            watch: {
                name(newVal, oldVal){
                    console.log(newVal, oldVal)
                }
            }
           
        })
    </script>
</body>
</html>

####6. axios

vue发送网络请求的一种方式类似ajax

跨域问题
    由于浏览器提供安全性同源策略(相同的协议相同域名相同的端口号)如果其中一个不同产生跨域问题
  
解决跨域问题
    配置一个跨域过滤器
package com.ujiuye.web.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 解决请求跨域问题
 */
@WebFilter(filterName = "Filter01", urlPatterns = "/*")
public class Filter01 implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletResponse response = (HttpServletResponse) resp;
        HttpServletRequest request = (HttpServletRequest) req;

        // 不使用*,自动适配跨域域名,避免携带Cookie时失效
        String origin = request.getHeader("Origin");
        response.setHeader("Access-Control-Allow-Origin", origin);

        // 自适应所有自定义头
        String headers = request.getHeader("Access-Control-Request-Headers");
        response.setHeader("Access-Control-Allow-Headers", headers);
        response.setHeader("Access-Control-Expose-Headers", headers);

        // 允许跨域的请求方法类型
        response.setHeader("Access-Control-Allow-Methods", "*");
        // 预检命令(OPTIONS)缓存时间,单位:秒
        response.setHeader("Access-Control-Max-Age", "3600");
        // 明确许可客户端发送Cookie,不允许删除字段即可
        response.setHeader("Access-Control-Allow-Credentials", "true");

        chain.doFilter(request, response);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}
方式1
     // 发送axios请求
    let p = new URLSearchParams()
    p.append("username", "xx")
    p.append("age", 18)
    axios({
        method: "post", // 请求方式
        url: "http://localhost:8080/JavaWeb_day18_axios_war_exploded/axiosTest", // 请求路径
        data: p,
        responseType: "text"
    }).then(resp => {
    // 请求成功 获取返回结果 resp
    console.log(resp.data)
}).catch(error => {

    // 请求失败 打印错误信息
    console.log(error)
})
    
注意
    1. 页面和后台部署的不是同一台服务器 发送ajax请求会产生跨域问题
    2. axios发送请求携带参数时 可以封装到URLSearchParams/FormData 中发送
    
    
方式2
    axios.get()
    axios.post()
    
    /* axios.get("http://localhost:8080/JavaWeb_day18_axios_war_exploded/axiosTest?username=root&age=20").then(resp => {
     console.log(resp)
}).catch(error => {
     console.log(error)
}) */
                    axios.post("http://localhost:8080/JavaWeb_day18_axios_war_exploded/axiosTest", p).then(resp => {
    console.log(resp)
}).catch(error => {
    console.log(error)
})

####7. 生命周期

	钩子函数vue的生命周期的过程中 自动触发的函数如果开发想要在某个时机执行一些操作可以指定该时机下的钩子函数
        beforeCreate  Vue未初始化之前执行
        created     Vue属性初始化之后执行  加载页面之前获取数据一般在此时机
        beforeMount  dom操作之前执行
        mounted      dom加载之后执行
        beforeUpdate  修改dom之前执行
        updated     修改dom之后执行
        beforeDestroy vue销毁之前
        destroyed    vue销毁之后执行


avatar
青山
悟已往之不谏 知来者之可追
一言
今日诗词
站点信息
本站访客数 :
本站总访问量 :