JS+JSON+Vue
JS核心语法
内部脚本:script标签定义的js代码块建议放在<body>元素的底部
<script>
// 定义变量:使用let关键字
let a = 3;
a = "Hello Js";
alert('a'); //弹出警告框,常用
//定义常量:使用const关键字
const PI = 3.14;
console.log(PI); //写入浏览器控制台,常用
document.write(PI);//直接写入body内,不常用
</script>
JavaScript是一门弱类型语言,共有五种基本数据类型:number,boolean,string,null,undefined.
可用typeof()方法判别类型.
//1. 数据类型
alert(typeof 10); //number类型
alert(typeof 1.5);
alert(typeof true); //boolean类型
alert(typeof false);
alert(typeof "Hello"); //string类型
alert(typeof 'JS');
alert(typeof `JavaScript`);
alert(typeof null); //object类型
let a ;
alert(typeof a); //undefined类型
JS的string类型中反引号``的用途:作模板字符串,方便字符串的拼接
let name = 'Bob';
let age = '20';
console.log('我的姓名:'+name+',我的年龄:'+age);//一般写法
console.log(`我的姓名:${name},我的年龄:${age}`);//反引号写法
JS函数篇
<script>
//一.具名函数
function add(a,b){
return a+b;
}
let res = add(10,20);
console.log(res);
//二.匿名函数(两种表示方法:表达式,箭头)
//表达式函数
let add1 = function(a,b){
return a+b;
}
let res1 = add1(10,20);
console.log(res1);
//箭头函数
let add2 = (a,b) =>{
return a+b;
}
let res2 = add1(10,20);
console.log(res2);
</script>
JS自定义对象篇
<script>
//自定义对象
let user = {
name: 'Tom',
age: 20,
gender: '男',
sing: function(){
alert(this.name+'在唱歌');
}
}
alert(user.name);
user.sing();
//方法简写
let user1 = {
name: 'Bob',
age: 20,
gender: '男',
sing(){
alert(this.name+'在唱歌');
}
}
alert(user1.name);
user1.sing();
//自定义对象中不建议使用箭头函数表示方法
let user3 = {
name: 'Nik',
age: 20,
gender: '男',
sing: () => { //箭头函数体内的this指向的不是当前对象,而是当前对象的父级(当前为object windows)
alert(this+'在唱歌');
}
}
alert(user3.name);
user3.sing();
</script>
DOM篇
DOM: 全称Document Object Model,文档对象模型.
由JS所提供,专为操作网页内容的一类接口.
将html中所有的内容都封装为对象,采用面向对象的方式来操作内容
<body>
<h1>111111</h1>
<h1>222222</h1>
<h1>333333</h1>
<script>
//使用DOM修改第一个标签里的文本内容
//1.获取DOM对象(使用元素选择器)
let h1 = document.querySelector('h1'); //document.querySelector()方法用于修改选择器选中的第一个元素
let h2 = document.querySelectorAll('h1'); //document.querySelector()方法用于修改选择器选中的所有元素,用伪数组来存储,可通过索引依次访问,但其并无数组类方法
//2.调用DOM对象中的属性或方法
h1.innerHTML = 'aaaaaa';
h2[0].innerHTML = 'bbbbbb';
//选择器还有id选择器,class选择器
//let h1 = document.querySelector('#id'); //id选择器
//let h1 = document.querySelector('.class'); //class选择器
</script>
</body>
JSON篇
json格式中的key必须用双引号""包围
//JSON
let ren = {
name:'a',
age:19,
aihao:'a'
}
//stringify()方法,将js对象转换为json字符串
alert(JSON.stringify(ren));
//parse()方法,用于将json字符串转换为js对象格式
let ren1 = '{"name": "a","age" :20}';
alert(JSON.parse(ren1).name);
JS事件篇
语法:事件源.addEventListener('事件类型',执行函数);
<body>
<input type="button" id="btn1" value="点我一下试试1">
<input type="button" id="btn2" value="点我一下试试2">
<script>
//推荐用法:addEventListener()方法,可定义多个事件监听,不会覆盖
document.querySelector('#btn1').addEventListener('click',() => {
console.log("样吧样吧");
})
document.querySelector('#btn1').addEventListener('click',() => {
console.log("哎样吧样吧也出现了");
})
//不推荐用法:onclick(),on方式定义多个事件监听时后者会覆盖前者
document.querySelector('#btn2').onclick = () => {
console.log("不样吧");
}
document.querySelector('#btn2').onclick = () => {
console.log("不样吧被覆盖了");
}
</script>
</body>
小案例
<script>
//通过JS为上述的表格中数据行添加事件监听, 实现鼠标进入后, 背景色#f2e2e2; 鼠标离开后, 背景色需要设置为#fff; (JS新版本的语法)
let a = document.querySelectorAll('tr');
for(let i=0;i<a.length;i++){
a[i].addEventListener('mouseenter',function (){
this.style.backgroundColor = "#f2e2e2";
})
a[i].addEventListener('mouseleave',function(){
this.style.backgroundColor = "#fff";
})
}
</script>
常见事件
<script>
//click: 鼠标点击事件
document.querySelector('#b2').addEventListener('click', () => {
console.log("我被点击了...");
})
//mouseenter: 鼠标移入
document.querySelector('#last').addEventListener('mouseenter', () => {
console.log("鼠标移入了...");
})
//mouseleave: 鼠标移出
document.querySelector('#last').addEventListener('mouseleave', () => {
console.log("鼠标移出了...");
})
//keydown: 某个键盘的键被按下
document.querySelector('#username').addEventListener('keydown', () => {
console.log("键盘被按下了...");
})
//keyup: 某个键盘的键被抬起
document.querySelector('#username').addEventListener('keyup', () => {
console.log("键盘被抬起了...");
})
//blur: 失去焦点事件
document.querySelector('#age').addEventListener('blur', () => {
console.log("失去焦点...");
})
//focus: 元素获得焦点
document.querySelector('#age').addEventListener('focus', () => {
console.log("获得焦点...");
})
//input: 用户输入时触发
document.querySelector('#age').addEventListener('input', () => {
console.log("用户输入时触发...");
})
//submit: 提交表单事件
document.querySelector('form').addEventListener('submit', () => {
alert("表单被提交了...");
})
</script>
JS优化篇
JS模块化:import,exeport
//event.js
import {print} from './utils.js';
//click: 鼠标点击事件
document.querySelector('#b2').addEventListener('click', () => {
print("我被点击了...");
})
//mouseenter: 鼠标移入
document.querySelector('#last').addEventListener('mouseenter', () => {
print("鼠标移入了...");
})
//mouseleave: 鼠标移出
document.querySelector('#last').addEventListener('mouseleave', () => {
print("鼠标移出了...");
})
//keydown: 某个键盘的键被按下
document.querySelector('#username').addEventListener('keydown', () => {
print("键盘被按下了...");
})
//keyup: 某个键盘的键被抬起
document.querySelector('#username').addEventListener('keyup', () => {
print("键盘被抬起了...");
})
//blur: 失去焦点事件
document.querySelector('#age').addEventListener('blur', () => {
print("失去焦点...");
})
//focus: 元素获得焦点
document.querySelector('#age').addEventListener('focus', () => {
print("获得焦点...");
})
//input: 用户输入时触发
document.querySelector('#age').addEventListener('input', () => {
print("用户输入时触发...");
})
//submit: 提交表单事件
document.querySelector('form').addEventListener('submit', () => {
alert("表单被提交了...");
})
//utils.js
export function print(a){
console.log(a);
}
html页面中使用下列代码导入模块化文件(模块化JS必须加type="module")
<script src="./js/event.js" type="module"></script>
Vue篇
Vue:用于构建用户界面的渐进式JavaScript框架。
Vue构建步骤:
一、准备
1.1:引入Vue模块(本文使用ES模块构建,可参考https://vuejs.org/guide/quick-start.html)
1.2:创建vue程序的应用实例,控制视图元素
1.3:准备元素div,被Vue控制
<body>
<div id="app">
<h1></h1>
</div>
<script type="module">
import { createApp, ref } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
createApp({
data() {
return {
}
}
}).mount('#app');
</script>
二、数据驱动视图
2.1:准备数据(写在return方法体内)
message:"Hello Vue"
2.2:通过插值表达式渲染页面(使用双大括号包围,写在标签的文本区域,本文为{{message}})
<body>
<div id="app">
<h1>{{message}}</h1>
</div>
Aue常用指令
一、v-for
用于列表渲染,遍历容器的元素。
//语法:
<h1 v-for = "(item,index) in items" :key = "item.id">
<!-- 表格展示区 -->
<table>
<!-- 表头 -->
<thead>
<tr>
<th>序号</th>
<th>姓名</th>
<th>性别</th>
<th>头像</th>
<th>职位</th>
<th>入职日期</th>
<th>最后操作时间</th>
<th>操作</th>
</tr>
</thead>
<!-- 表格主体内容 -->
<tbody>
<tr v-for="(e, index) in empList" :key="e.id">
<td>{{index+1}}</td>
<td>{{e.name}}</td>
<td>{{e.gender == 1 ? '男' : '女'}}</td>
<td><img class="avatar" src="https://web-framework.oss-cn-hangzhou.aliyuncs.com/2023/1.jpg" alt="令狐冲"></td>
<td>{{e.job}}</td>
<td>{{e.entrydate}}</td>
<td>{{e.updatetime}}</td>
<td class="action-buttons">
<button type="button">编辑</button>
<button type="button">删除</button>
</td>
</tr>
</tbody>
</table>
<script type="module">
import { createApp } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
createApp({
data() {
return {
empList: [
{ "id": 1,
"name": "谢逊",
"image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2023/4.jpg",
"gender": 1,
"job": "1",
"entrydate": "2023-06-09",
"updatetime": "2024-09-30T14:59:38"
},
{
"id": 2,
"name": "韦一笑",
"image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2023/1.jpg",
"gender": 1,
"job": "1",
"entrydate": "2020-05-09",
"updatetime": "2024-09-01T00:00:00"
},
{
"id": 3,
"name": "黛绮丝",
"image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2023/2.jpg",
"gender": 2,
"job": "2",
"entrydate": "2021-06-01",
"updatetime": "2024-09-01T00:00:00"
}
]
}
}
}).mount('#container')
</script>
最终效果:
二、v-bind
用于动态绑定标签属性值。(原因:插值表达式不允许出现在标签内部)
语法:v-bind:属性值=“demo”或:属性值=“demo”(后者为简写版)
<td><img class="avatar" v-bind:src="e.image" :alt="e.name"></td>
三、v-if&&v-show
<td>
<!-- v-if指令,只渲染满足条件的属性值,适用于不频繁切换的场景 -->
<span v-if="e.job == 1">班主任</span>
<span v-else-if="e.job == 2">讲师</span>
<span v-else-if="e.job == 3">学工主管</span>
<span v-else-if="e.job == 4">教研主管</span>
<span v-else-if="e.job == 5">咨询师</span>
<span v-else>其他</span>
</td>
<td>
<!-- v-show指令,通过css的display属性值控制元素的显示与隐藏,全部属性值都会渲染,适用于频繁切换的场景 -->
<span v-show ="e.job == 1">班主任</span>
<span v-show="e.job == 2">讲师</span>
<span v-show="e.job == 3">学工主管</span>
<span v-show="e.job == 4">教研主管</span>
<span v-show="e.job == 5">咨询师</span>
</td>
最终效果:
四、v-model && v-on
v-model指令用于对表单元素进行双向绑定,以获取或设置表单项数据。
语法:在标签内 v-model = "变量",变量在data中生成
<input type="text" id="name" name="name" placeholder="请输入姓名" v-model="searchForm.name">
<select id="gender" name="gender" v-model="searchForm.gender">
<select id="position" name="position" v-model="searchForm.job">
return {
searchForm: {
name: '',
gender:'',
job:''
}
}
v-on指令:为html标签绑定事件(添加事件监听)
语法:v-on :事件名 = “方法名” || @事件名:"方法名"
在methods中,想要获取Vue应用实例中的数据,需通过this关键字
methods:{ //与data同级,在methods中,想要获取Vue应用实例中的数据,需通过this关键字
submit(){
console.log(this.searchForm); //this指向当前vue应用实例
},
clear(){
this.searchForm = {name:'',gender:'',job:''}
}
}
<button type="button" v-on:click="submit">查询</button>
<button type="button" @click="clear">清空</button>
Ajax篇
Ajax,异步JavaScript和XML(XML:可扩展标记语言,本质是一种数据格式,用于存储复杂的数据结构)
Axios对Ajax进行了封装,简化了开发
步骤:1.引入Axios的js文件。2.使用axios发送请求并获取响应结果.
初识
<body>
<input type="button" value="获取数据GET" id="btnGet">
<input type="button" value="操作数据POST" id="btnPost">
<script src="js/axios.js"></script>
<script>
//发送GET请求
document.querySelector('#btnGet').addEventListener('click', () => {
axios.get('https://mock.apifox.cn/m1/3083103-0-default/emps/list').then((result) => {
console.log(result);
}).catch((err) => {
});
console.log('=================='); //“======================”先输出,result后输出,证明ajax请求为异步,不会等到服务器返回消息,会接着往下执行程序
})
//发送POST请求
document.querySelector('#btnPost').addEventListener('click', () => {
axios.post('https://mock.apifox.cn/m1/3083103-0-default/emps/update').then((result) => {
console.log(result);
}).catch((err) => {
});
})
</script>
</body>
使用ajax技术实现动态访问服务器数据并展示
methods:{
async submit(){
//发送异步请求,获取数据
// axios.get(`https://web-server.itheima.net/emps/list?name=${this.searchForm.name}&gender=${this.searchForm.gender}&job=${this.searchForm.job}`).then((result) => {
// this.empList = result.data.data;
// })
//通过ansyc,await使异步操作变为同步操作,使程序真正意义上的从上往下顺序执行,提高程序可读性,便于维护
let result = await axios.get(`https://web-server.itheima.net/emps/list?name=${this.searchForm.name}&gender=${this.searchForm.gender}&job=${this.searchForm.job}`);//反引号为模板字符串
this.empList = result.data.data;
console.log(result);//先输出
console.log("===============");//后输出
},
//清空表单内容,并展示出全部数据
clear(){
this.searchForm = {name:'',gender:'',job:''}
this.submit()
}
}
钩子函数
(Vue应用实例在不同生命周期阶段(共八个)触发生命周期事件时自动执行的生命周期方法统称为钩子函数)
mounted(){
//钩子函数mounted(),用于在页面加载完成后立即渲染数据
this.submit()
}
前端基础篇至此完结撒花,少年仍需努力。