加载中...
avatar
文章
42
标签
25
分类
21
首页
Java
Spring全家桶
  • Spring
  • SpringBoot
  • SpringCloud
JVM
源码
  • Mybatis
  • HashMap
归档
其他
  • 互联网电子书汇总
  • JAVA八股文指南
  • 历史
  • 相册
关于
Logo码农Stormling谷粒商城(三)| 前端基础
搜索
首页
Java
Spring全家桶
  • Spring
  • SpringBoot
  • SpringCloud
JVM
源码
  • Mybatis
  • HashMap
归档
其他
  • 互联网电子书汇总
  • JAVA八股文指南
  • 历史
  • 相册
关于

谷粒商城(三)| 前端基础

发表于2021-11-22|更新于2025-01-07|谷粒商城
|总字数:3.5k|阅读时长:16分钟|浏览量:

前端基础

前后端对比

在这里插入图片描述

ES6

ECMAScript 6.0(以下简称 ES6,ECMAScript是一种由Ecma国际通过ECMA-262标准化的脚本), 是JavaScript语言的下一代标准,2015年6月正式发布,从ES6开始的版本号采用年号,如ES2015,就是ES6。ES2016就是ES7。 ECMAScript是规范,JS的规范的具体实现。

let & const

  • 作用域:var在{}之外也起作用 let在{}之外不起作用
  • 声明次数:var 多次声明同一变量不会报错,let多次声明会报错,只能声明一次。
  • 变量提升:var 会变量提升(打印和定义可以顺序反);let 不存在变量提升(顺序不能反)
  • const 声明之后不允许改变
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    

    <script>
       // var 声明的变量往往会越域
       // let 声明的变量有严格局部作用域
//         {
//             var a = 1;
//             let b = 2;
//         }
//         console.log(a);  // 1
//         console.log(b);  // ReferenceError: b is not defined

    // var 可以声明多次
            // let 只能声明一次
//         var m = 1
//         var m = 2
//         let n = 3
//       let n = 4
//         console.log(m)  // 2
//         console.log(n)  // Identifier 'n' has already been declared

        // var 会变量提升
        // let 不存在变量提升
//         console.log(x);  // undefined
//         var x = 10;
//         console.log(y);   //ReferenceError: y is not defined
//         let y = 20;

        // const
        // 1. const声明之后不允许改变
        // 2. 一但声明必须初始化,否则会报错
        const a = 1;
        a = 3; //Uncaught TypeError: Assignment to constant variable.
    
    </script>

</body>
</html>

解构表达式

  • 数组解构:支持 let arr = [1,2,3]; let [a,b,c] = arr
  • 冒号改名:const { name: abc, age, language } = person
  • 字符串函数:支持一个字符串为多行 占位符功能 ${}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>

    <script>
        //数组解构
        // let arr = [1,2,3];
        // // let a = arr[0];
        // // let b = arr[1];
        // // let c = arr[2];

        // let [a,b,c] = arr;
        // console.log(a,b,c)

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

        //对象解构
        const { name: abc, age, language } = person;
        console.log(abc, age, language)

        // 字符串扩展
        let str = "hello.vue";
        console.log(str.startsWith("hello"));//true
        console.log(str.endsWith(".vue"));//true
        console.log(str.includes("e"));//true
        console.log(str.includes("hello"));//true

        //字符串模板
        let ss = `<div>
                    <span>hello world<span>
                </div>`;
        console.log(ss);

        // 字符串插入变量和表达式。变量名写在 ${} 中,${} 中可以放入 JavaScript 表达式。

        function fun() {
            return "这是一个函数"
        }

        let info = `我是${abc},今年${age + 10}了, 我想说: ${fun()}`;
        console.log(info);

    </script>
</body>
</html>

函数优化

  • 函数默认值: b = b || 1; 现在可以直接写了function add2(a, b = 1)
  • 不定参数:function fun(...values) {
  • 支持箭头函数(lambda表达式),还支持使用{}结构传入对象的成员
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>

    <script>
        //在ES6以前,我们无法给一个函数参数设置默认值,只能采用变通写法:
        function add(a, b) {
            // 判断b是否为空,为空就给默认值1
            b = b || 1;
            return a + b;
        }
        // 传一个参数
        console.log(add(10));


        //现在可以这么写:直接给参数写上默认值,没传就会自动使用默认值
        function add2(a, b = 1) {
            return a + b;
        }
        console.log(add2(20));


        //不定参数
        function fun(...values) {
            console.log(values.length)
        }
        fun(1, 2)      //2
        fun(1, 2, 3, 4)  //4

        //箭头函数
        //以前声明一个方法
        // var print = function (obj) {
        //     console.log(obj);
        // }
        var print = obj => console.log(obj);
        print("hello");

        var sum = function (a, b) {
            c = a + b;
            return a + c;
        }

        var sum2 = (a, b) => a + b;
        console.log(sum2(11, 12));

        var sum3 = (a, b) => {
            c = a + b;
            return a + c;
        }
        console.log(sum3(10, 20))


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

        function hello(person) {
            console.log("hello," + person.name)
        }

        //箭头函数+解构
        var hello2 = ({name}) => console.log("hello," +name);
        hello2(person);

    </script>
</body>
</html>

对象优化

  • map:获取map的键值对等Object.keys()、values、entries
  • 对象合并:Object.assign(target,source1,source2)
  • 声明简写:const person2 = { age, name }
  • 对象拷贝:let someone = { …p1 }
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        const person = {
            name: "jack",
            age: 21,
            language: ['java', 'js', 'css']
        }

        console.log(Object.keys(person));//["name", "age", "language"]
        console.log(Object.values(person));//["jack", 21, Array(3)]
        console.log(Object.entries(person));//[Array(2), Array(2), Array(2)]

        const target = { a: 1 };
        const source1 = { b: 2 };
        const source2 = { c: 3 };

        //{a:1,b:2,c:3}
        Object.assign(target, source1, source2);

        console.log(target);//["name", "age", "language"]

        // 声明对象简写
        const age = 23
        const name = "张三"
        const person1 = { age: age, name: name }

        const person2 = { age, name }//声明对象简写
        console.log(person2);

        // 对象的函数属性简写
        let person3 = {
            name: "jack",
            // 以前:
            eat: function (food) {
                console.log(this.name + "在吃" + food);
            },
            //箭头函数this不能使用,对象.属性
            eat2: food => console.log(person3.name + "在吃" + food),
            eat3(food) {
                console.log(this.name + "在吃" + food);
            }
        }

        person3.eat("香蕉");
        person3.eat2("苹果")
        person3.eat3("橘子");

        // 对象拓展运算符

        //  拷贝对象(深拷贝)
        let p1 = { name: "Amy", age: 15 }
        let someone = { ...p1 }
        console.log(someone)  //{name: "Amy", age: 15}

        //  合并对象
        let age1 = { age: 15 }
        let name1 = { name: "Amy" }
        let p2 = {name:"zhangsan"}
        p2 = { ...age1, ...name1 } 
        console.log(p2)
    </script>
</body>

</html>

map和reduce

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
    <script>
        //数组中新增了map和reduce方法。
        //map():接收一个函数,将原数组中的所有元素用这个函数处理后放入新数组返回。
         let arr = ['1', '20', '-5', '3'];
         
        //  arr = arr.map((item)=>{
        //     return item*2
        //  });
         arr = arr.map(item=> item*2);

        

         console.log(arr);
        //reduce() 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,
        //[2, 40, -10, 6]
        //arr.reduce(callback,[initialValue])
        /**
     1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
    2、currentValue (数组中当前被处理的元素)
    3、index (当前元素在数组中的索引)
    4、array (调用 reduce 的数组)*/
        let result = arr.reduce((a,b)=>{
            console.log("上一次处理后:"+a);
            console.log("当前正在处理:"+b);
            return a + b;
        },100);
        console.log(result)

    
    </script>
</body>
</html>

promise

  • 封装:赋值给 let p 在Ajax中成功使用 resolve(data),交给then处理, 失败使用reject(err),交给catch处理p.then().catch()
//corse_score_10.json 得分
{
    "id": 100,
    "score": 90
}

//user.json 用户
{
    "id": 1,
    "name": "zhangsan",
    "password": "123456"
}


//user_corse_1.json 课程
{
    "id": 10,
    "name": "chinese"
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
    <script>
        //1、查出当前用户信息
        //2、按照当前用户的id查出他的课程
        //3、按照当前课程id查出分数
        // $.ajax({
        //     url: "mock/user.json",
        //     success(data) {
        //         console.log("查询用户:", data);
        //         $.ajax({
        //             url: `mock/user_corse_${data.id}.json`,
        //             success(data) {
        //                 console.log("查询到课程:", data);
        //                 $.ajax({
        //                     url: `mock/corse_score_${data.id}.json`,
        //                     success(data) {
        //                         console.log("查询到分数:", data);
        //                     },
        //                     error(error) {
        //                         console.log("出现异常了:" + error);
        //                     }
        //                 });
        //             },
        //             error(error) {
        //                 console.log("出现异常了:" + error);
        //             }
        //         });
        //     },
        //     error(error) {
        //         console.log("出现异常了:" + error);
        //     }
        // });


        //1、Promise可以封装异步操作
        // let p = new Promise((resolve, reject) => { //传入成功解析,失败拒绝
        //     //1、异步操作
        //     $.ajax({
        //         url: "mock/user.json",
        //         success: function (data) {
        //             console.log("查询用户成功:", data)
        //             resolve(data);
        //         },
        //         error: function (err) {
        //             reject(err);
        //         }
        //     });
        // });

        // p.then((obj) => { //成功以后做什么
        //     return new Promise((resolve, reject) => {
        //         $.ajax({
        //             url: `mock/user_corse_${obj.id}.json`,
        //             success: function (data) {
        //                 console.log("查询用户课程成功:", data)
        //                 resolve(data);
        //             },
        //             error: function (err) {
        //                 reject(err)
        //             }
        //         });
        //     })
        // }).then((data) => { //成功以后干什么
        //     console.log("上一步的结果", data)
        //     $.ajax({
        //         url: `mock/corse_score_${data.id}.json`,
        //         success: function (data) {
        //             console.log("查询课程得分成功:", data)
        //         },
        //         error: function (err) {
        //         }
        //     });
        // })

        function get(url, data) { //自己定义一个方法整合一下
            return new Promise((resolve, reject) => {
                $.ajax({
                    url: url,
                    data: data,
                    success: function (data) {
                        resolve(data);
                    },
                    error: function (err) {
                        reject(err)
                    }
                })
            });
        }

        get("mock/user.json")
            .then((data) => {
                console.log("用户查询成功~~~:", data)
                return get(`mock/user_corse_${data.id}.json`);
            })
            .then((data) => {
                console.log("课程查询成功~~~:", data)
                return get(`mock/corse_score_${data.id}.json`);
            })
            .then((data)=>{
                console.log("课程成绩查询成功~~~:", data)
            })
            .catch((err)=>{ //失败的话catch
                console.log("出现异常",err)
            });

    </script>
</body>

</html>

模块化

  • 代码拆分:类似Java导包,导模块。
  • 命令:export 和 import
    • export 用于规定模块的对外接口
    • import 用于导入其他模块提供的功能
user.js
var name = "jack"
var age = 21
function add(a,b){
    return a + b;
}

export {name,age,add}

hello.js
// export const util = {
//     sum(a, b) {
//         return a + b;
//     }
// }

export default {
    sum(a, b) {
        return a + b;
    }
}
// export {util}

//`export`不仅可以导出对象,一切JS变量都可以导出。比如:基本类型变量、函数、数组、对象。


main.js
import abc from "./hello.js"
import {name,add} from "./user.js"

abc.sum(1,2);
console.log(name);
add(1,3);

Vue

MVVM思想

  • M:model 包括数据和一些基本操作

  • V:view 视图,页面渲染结果

  • VM:View-model,模型与视图间的双向操作(无需开发人员干涉) 视图和数据通过VM绑定起来,model里有变化会自动地通过Directives填写到视view中, 视图表单中添加了内容也会自动地通过DOM Listeners保存到模型中。

案例

npm init -y
//教学的版本是Vue2,目前版本是Vue3
npm i vue@2 
在VSCode中安装vue 2 snippets语法提示插件,在谷歌浏览器中安装vue.js devtools

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>

    <div id="app">
        <input type="text" v-model="num">
        v-model实现双向绑定
        <button v-on:click="num++">点赞</button>
        v-on:click绑定事件,实现自增
        <button v-on:click="cancel">取消</button>
        回到自定义的方法
        
        <h1> {{name}} ,非常帅,有{{num}}个人为他点赞{{hello()}}</h1>
    </div>

    <!-- 导入依赖 -->
    <script src="./node_modules/vue/dist/vue.js"></script>

    <script>
        //1、vue声明式渲染
        let vm = new Vue({ //生成vue对象
            el: "#app",//绑定元素 div id="app"
            data: {  //封装数据
                name: "张三",  // 也可以使用{} //表单中可以取出
                num: 1
            },
            methods:{  //封装方法
                cancel(){
                    this.num -- ;
                },
                hello(){
                    return "1"
                }
            }
        });
        还可以在html控制台 vm.name ,vm 表示 Vue对象的实例

        //2、双向绑定,模型变化,视图变化。反之亦然。
        //3、事件处理

        //v-xx:指令

        //1、创建vue实例,关联页面的模板,将自己的数据(data)渲染到关联的模板,响应式的
        //2、指令来简化对dom的一些操作。
        //3、声明方法来做更复杂的操作。methods里面可以封装方法。

    </script>
</body>

</html>

组件化

在大型应用开发的时候,页面可以划分成很多部分。往往不同的页面,也会有相同的部分。 例如可能会有相同的头部导航。 但是如果每个页面都自开发,这无疑增加了我们开发的成本。

把页面拆成不同的组件,然后共享组件,避免重复开发。 在vue里,所有的vue实例都是组件,组件其实也是一个vue实例,因此它在定义时也会接收:data、methods、生命周期函等 不同的是组件不会与页面的元素綁定,否则就无法复用了,因此没有el属性。

但是组件渲染需要html模板,所以增加了template属性,值就是HTML模板 全局组件定义完毕,任何vue实例都可以直接在HTML中通过组件名称来使用组了 data必须是一个函数,不再是一个对象。

Vue脚手架

# 全局安装 Webpack
npm i webpack -g
# 全局安装脚手架
npm i vue-cli -g
# 查看版本 2.9.6
vue -V
# 使用 webpack 模板项目 初始化一个 appname 项目
vue init webpack appname:vue 
# 启动项目,项目中的package.json 中 scripts,代表运行命令
npm start = npm run dev 
# 项目打包
npm run build

示例

$ `vue init webpack app`

? Target directory exists. Continue? (Y/n) y
? Target directory exists. Continue? Yes

? Project name app
? Project description (A Vue.js project)
? Project description A Vue.js project
? Author (lingzhexi <lingzhexi@gmail.com>)
? Author lingzhexi <lingzhexi@gmail.com>
? Vue build (Use arrow keys)
? Vue build standalone
? Install vue-router? (Y/n) `y`
? Install vue-router? Yes
? Use ESLint to lint your code? (Y/n) `n`
? Use ESLint to lint your code? No
? Set up unit tests (Y/n) `n`
? Set up unit tests No
? Setup e2e tests with Nightwatch? (Y/n) `y`
? Setup e2e tests with Nightwatch? Yes
? Should we run `npm install` for you after the project has been created? (recom
? Should we run `npm install` for you after the project has been created? (recom
mended) yarn

   vue-cli · Generated "app".


# Installing project dependencies ...
# ========================

'yarn' is not recognized as an internal or external command,
operable program or batch file.

# Project initialization finished!
# ========================

To get started:

  cd app
  npm run dev

Documentation can be found at https://vuejs-templates.github.io/webpack

使用element-UI

# 安装
npm i elemenet-ui -S
# 在 main.js 中写入以下内容:
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);

补充

# 补充依赖
npm i webpack-dev-server --save-dev
文章作者: stormling
文章链接: http://www.stormling.top/posts/31297.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 码农Stormling!
谷粒商城
cover of previous post
上一篇
网络系列(一)| TCP 快速入门
简介互联网有一整套协议构成,TCP是其中的一层 以太网 作用:电子信号如何组成数据包(packet),解决了子网内部点对点通信 缺点:无法连接多个局域网,IP协议解决 IP 作用:定义一套自己的地址规则,通过路由的形式将各个局域网相连。路由器基于IP协议 路由器内部有一张路由表,规定 IP 出口,实现数据包转发 缺点:是地址协议,不能保证数据完整,TCP 协议解决 TCP 作用: 保证数据通信的完整性和可靠性,防止丢包 TCP 数据包以太网的数据包 大小固定,最初1518 增加到 1522 字节 。其中头信息(head)22 字节,负载(payload):1500字节 以太网数据包:1522 字节 头信息:22 负载:1500 IP数据包 头信息:20(最少) 负载:1480 TCP 数据包 头信息:20 (最少) 负载:1400 TCP 数据包编号(SEQ)TCP 为每个数据包编号(sequence number),目的是为了接收方按照顺序还原。另外,万一丢包也可知道丢失哪一个包。 每个数据包都有两个编号 自身编号:sequence...
cover of next post
下一篇
谷粒商城(二)| 整合微服务
整合微服务 搭配方案 SpringCloud Alibaba - Nacos : 注册中心 (服务发现/注册) SpringCloud Alibaba - Nacos : 配置中心 (动态配置管理) SpringCloud - Ribbon : 负载均衡 SpringCloud - Feign : 声明式 HTTP 客户端 (调用远程服务) SpringCloud Alibaba - Sentinel : 服务容错 (限流、降级、熔断) SpringCloud - Gateway : API 网关 (webflux 编程模式) SpringCloud - Sleuth : 调用链监控 SpringCloud Alibaba - Seata : 原 Fescar 即分布式事务解决方案 阿里巴巴中文文档:SpringCloud Alibab 中文文档 版本选择SpringCloud与SpringBoot SpringCloud - SpringBoot 版本对比(SpringCloud 官网) ...
相关推荐
cover
2021-11-18
谷粒商城(二)| 整合微服务
整合微服务 搭配方案 SpringCloud Alibaba - Nacos : 注册中心 (服务发现/注册) SpringCloud Alibaba - Nacos : 配置中心 (动态配置管理) SpringCloud - Ribbon : 负载均衡 SpringCloud - Feign : 声明式 HTTP 客户端 (调用远程服务) SpringCloud Alibaba - Sentinel : 服务容错 (限流、降级、熔断) SpringCloud - Gateway : API 网关 (webflux 编程模式) SpringCloud - Sleuth : 调用链监控 SpringCloud Alibaba - Seata : 原 Fescar 即分布式事务解决方案 阿里巴巴中文文档:SpringCloud Alibab 中文文档 版本选择SpringCloud与SpringBoot SpringCloud - SpringBoot 版本对比(SpringCloud 官网) ...

评论
ValineGitalk
avatar
stormling
文章
42
标签
25
分类
21
Follow Me
公告
欢迎大家来到Stormling博客
目录
  1. 1. 前端基础
    1. 1.1. 前后端对比
    2. 1.2. ES6
      1. 1.2.1. let & const
      2. 1.2.2. 解构表达式
      3. 1.2.3. 函数优化
      4. 1.2.4. 对象优化
      5. 1.2.5. map和reduce
      6. 1.2.6. promise
      7. 1.2.7. 模块化
    3. 1.3. Vue
      1. 1.3.1. MVVM思想
      2. 1.3.2. 案例
      3. 1.3.3. 组件化
      4. 1.3.4. Vue脚手架
        1. 1.3.4.1. 示例
      5. 1.3.5. 使用element-UI
      6. 1.3.6. 补充
最新文章
面向八股文面试专场
面向八股文面试专场2025-01-22
【每日早报】-2025-01-21 - 星期二
【每日早报】-2025-01-21 - 星期二2025-01-21
规则引擎 Drools 8+ 快速入门
规则引擎 Drools 8+ 快速入门2024-12-11
数据库系列(二) | Mybatis Plus 3.0+快速入门
数据库系列(二) | Mybatis Plus 3.0+快速入门2024-12-09
分布式系列(二) | Redisson分布式锁
分布式系列(二) | Redisson分布式锁2024-12-05
©2019 - 2025 By stormling
码农Stormling程序员,关注公众号【码农Stormling】回复【面试】获取最全面试pdf
搜索
数据加载中