当前位置: 首页 > news >正文

java前端基础--HTMLCSS、JavaScript、Vue、Ajax

目录

 Web标准

Web前端基础

HTML&CSS

标题常见标签&样式

CSS引入方式

颜色表示方式

CSS选择器

正文常见标签&样式

布局--盒子模型

顶部导航栏--flex布局

表单标签

表格标签

JS

引入方式

基础语法

变量 / 常量

输出语句

数据类型

函数

自定义对象

JSON

DOM

JS事件监听

Vue3

Vue快速入门

Vue指令

v-for

v-bind

v-if & v-show

v-model

v-on

Ajax

概述:

同步异步

Axios

异步变同步:

Vue生命周期


 Web标准

Web 标准也称网页标准,由一系列的标准组成,大部分由 W3C(World Wide Web Consortium,万维网联盟)负责制定。
三个组成部分:

  • HTML:负责网页的结构(页面元素和内容)。
  • CSS:负责网页的表现(页面元素的外观、位置等页面样式,如:颜色、大小等)。
  • JavaScript:负责网页的行为(交互效果)。

Web前端基础

MDN:提供了大量与Web开发相关的文档、教程和参考资料。

HTML&CSS

标题常见标签&样式

标题标签 h 系列:

<h1> 11111111111111 </h1>

<h2> 11111111111111 </h2>

<h3> 11111111111111 </h3>

<h4> 11111111111111 </h4>

<h5> 11111111111111 </h5>

<h6> 11111111111111 </h6>

效果:h1为一级标题,字体也是最大的 ; h6为六级标题,字体是最小的。

注意:HTML标签是预定义好的,不能随意定义,也就以为着,标题标签就只有这六个,没有 <h7>

超链接 a 标签:

标签:<a href="....." target=".....">央视网</a>

属性:

  • href: 指定资源访问的url

  • target: 指定在何处打开资源链接

    • _self: 默认值,在当前页面打开

    • _blank: 在空白页面打开

CSS引入方式

那在HTML的文件中,我们如何来编写CSS样式呢,此时就涉及到CSS的三种引入方式。

具体有3种引入方式,语法如下表格所示:

名称语法描述示例
行内样式在标签内使用style属性,属性值是css属性键值对。<h1 style="xxx:xxx;">中国新闻网</h1>
内部样式定义<style>标签,在标签内部定义css样式。<style> h1 {...} </style>
外部样式定义<link>标签,通过href属性引入外部css文件<link rel="stylesheet" href="css/news.css">

对于上述3种引入方式,企业开发的使用情况如下:

  • 行内样式:会出现大量的代码冗余,不方便后期的维护,所以不常用(常配合JS使用)。

  • 内部样式通过定义css选择器,让样式作用于当前页面的指定的标签上。(可以写在页面任何位置,但通常约定写在head标签中)

  • 外部样式:html和css实现了完全的分离,企业开发常用方式。

颜色表示方式

在前端程序开发中,颜色的表示方式常见的有如下三种:

表示方式属性值说明取值
关键字颜色英文单词red、green、bluered、green、blue...
rgb表示法rgb(r, g, b)红绿蓝三原色,每项取值范围:0-255rgb(0,0,0)、rgb(255,255,255)、rgb(255,0,0)
rgba表示法rgba(r, g, b, a)红绿蓝三原色,a表示透明度,取值:0-1rgb(0,0,0,0.3)、rgb(255,255,255,0.5)
十六进制表示法#rrggbb#开头,将数字转换成十六进制表示#000000、#ff0000、#cccccc,简写:#000、#ccc

CSS选择器

顾名思义:选择器是选取需设置样式的元素(标签),但是我们根据业务场景不同,选择的标签的需求也是多种多样的,所以选择器有很多种。

选择器通用语法如下

选择器名 { css样式名:css样式值; css样式名:css样式值; }

常见样式:

选择器写法示例示例说明
元素选择器元素名称 {...}h1 {...}选择页面上所有的<h1>标签
类选择器.class属性值 {...}.cls {...}选择页面上所有class属性为cls的标签
id选择器#id属性值 {...}#hid {...}选择页面上id属性为hid的标签
分组选择器选择器1,选择器2{...}h1,h2 {...}选择页面上所有的<h1>和<h2>标签
属性选择器元素名称[属性] {...}input[type] {...}选择页面上有type属性的<input>标签
元素名称[属性名="值"] {...}input[type="text"] {...}选择页面上type属性为text的<input>标签
后代选择器元素1元素2{...}form input {...}选择<form>标签内的所有<input>标签
优先级:id选择器>类选择器>元素选择器

正文常见标签&样式

标签作用属性/说明
<video>视频标签src:指定视频的url(绝对路径/相对路径)
controls:是否显示播放控件
width:宽度(像素/相对于父元素百分比);备注: 一般width 和 height 我们只会指定一个,另外一个会自动的等比例缩放。
height:高度(像素/相对于父元素百分比);备注: 一般width 和 height 我们只会指定一个,另外一个会自动的等比例缩放。
<img>图片标签src, width,height
<p>段落标签
<br>换行标签
<b> / <strong>加粗<strong> 具有强调语义
<u> / <ins>下划线<ins> 具有强调语义
<i> / <em>倾斜<em> 具有强调语义
<s> / <del>删除线<del> 具有强调语义

在HTML页面中,我们在代码中录入空格、<、> 这些符号的时候,是没有对应的效果的,因为浏览器并不能准确的识别,此时,我们就需要通过字符实体来表示空格,<, > 。常见符号的字符实体如下:

字符实体属性/说明
&nbsp;空格
&lt;<
&gt;>

路径表示

在引入图片、视频、音频、css等内容时,我们需要指定文件的路径,而在前端开发中,路径的书写形式分为两类:

  • 绝对路径:

    • 绝对磁盘路径: <img src="C:\Users\Administrator\Desktop\HTML\img\logo.png">

    • 绝对网络路径: <img src="https://i2.sinaimg.cn/dy/deco/2012/0613/yocc20120613img01/news_logo.png">

  • 相对路径:

./ : 当前目录 , ./ 可以省略的

../: 上一级目录

CSS属性

line-height:设置行高

text-indent:首行缩进

布局--盒子模型

介绍

  • 盒子:页面中所有的元素(标签),都可以看做是一个 盒子,由盒子将页面中的元素包含在一个矩形区域内,通过盒子的视角更方便的进行页面布局。

  • 盒子模型组成:内容区域(content)、内边距区域(padding)、边框区域(border)、外边距区域(margin)。

    <style>div {width: 200px;  /* 宽度 */height: 200px;  /* 高度 */box-sizing: border-box; /* 指定width height为盒子的高宽 */background-color: aquamarine; /* 背景色 */padding: 20px 20px 20px 20px; /* 内边距, 上 右 下 左 , 边距都一行, 可以简写: padding: 20px;*/ border: 10px solid red; /* 边框, 宽度 线条类型 颜色 */margin: 30px 30px 30px 30px; /* 外边距, 上 右 下 左 , 边距都一行, 可以简写: margin: 30px; */}</style>

布局标签

  • 布局标签:实际开发网页中,会大量频繁的使用 div 和 span 这两个没有语义的布局标签。

  • 标签:<div> <span>

  • 特点:

  • <div>标签:

    • 一行只显示一个(独占一行)

    • 宽度默认是父元素的宽度,高度默认由内容撑开

    • 可以设置宽高(width、height)

  • <span>标签:

    • 一行可以显示多个

    • 宽度和高度默认由内容撑开

    • 不可以设置宽高(width、height)

备注:

  • 上述的padding、margin属性值,可以是4个值、也可以是两个值、也可以是一个值,具体的含义如下:

  • padding: 20px 20px 20px 20px; -------> 表示上、右、下、左都是20px;

  • padding: 20px 10px; ----------------------> 表示上下是20px,左右是10px;

  • padding: 20px; -----------------------------> 表示上、右、下、左都是20px;

顶部导航栏--flex布局

  • flex是flexible Box的缩写,意为"弹性布局"。采用flex布局的元素,称为Flex容器(container),它的所有子元素自动成为容器成员,称为Flex项目(item)。

  • 通过给父容器添加flex属性,来控制子元素的位置和排列方式。

  • flex布局相关的CSS样式:

属性说明取值含义
display模式flex使用flex布局
flex-direction设置主轴row主轴方向为x轴,水平向右。(默认)
column主轴方向为y轴,垂直向下。
justify-content子元素在主轴上的对齐方式flex-start从头开始排列
flex-end从尾部开始排列
center在主轴居中对齐
space-around平分剩余空间
space-between先两边贴边,再平分剩余空间
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Tlias智能学习辅助系统</title><style>body {margin: 0;}/* 顶栏样式 */.header {display: flex;justify-content: space-between;align-items: center;background-color: #f1f1f1;padding: 10px 20px;box-shadow: 0 2px 5px rgba(0,0,0,0.1);}/* 加大加粗标题 */.header h1 {margin: 0;font-size: 24px;font-weight: bold;}/* 文本链接样式 */.header a {text-decoration: none;color: #333;font-size: 16px;}</style>
</head>
<body><!-- 顶栏 --><div class="header"><h1>Tlias智能学习辅助系统</h1><a href="#">退出登录</a></div><!-- 其他部分可以在这里添加 -->
</body>
</html>

表单标签

整个窗口是一个表单,而表单是一项一项的,这个我们称为表单项 或 表单元素。

  • 表单场景: 表单就是在网页中负责数据采集功能的,如:注册、登录的表单。

  • 表单标签: <form>

  • 表单属性:

    • action: 规定表单提交时,向何处发送表单数据,表单提交的URL。

    • method: 规定用于发送表单数据的方式,常见为: GET、POST。

      • GET:表单数据是拼接在url后面的, 如: xxxxxxxxxxx?username=Tom&age=12,url中能携带的表单数据大小是有限制的。

      • POST: 表单数据是在请求体(消息体)中携带的,大小没有限制。

  • 表单项标签:在一个表单中,可以存在很多的表单项,而虽然表单项的形式各式各样,但是表单项的标签其实就只有三个,分别是:

1、<input>: 表单项 , 通过type属性控制输入形式。

type取值

描述

text

默认值,定义单行的输入字段

password

定义密码字段

radio

定义单选按钮

checkbox

定义复选框

file

定义文件上传按钮

date/time/datetime-local

定义日期/时间/日期时间

number

定义数字输入框

email

定义邮件输入框

hidden

定义隐藏域

submit / reset / button

定义提交按钮 / 重置按钮 / 可点击按钮

2、<select>: 定义下拉列表, <option> 定义列表项

3、<textarea>: 文本域

<!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>HTML-表单</title>
</head>
<body><!-- form表单属性: action: 表单提交的url, 往何处提交数据 . 如果不指定, 默认提交到当前页面method: 表单的提交方式 .get: 在url后面拼接表单数据, 比如: ?username=Tom&age=12 , url长度有限制 . 默认值post: 在消息体(请求体)中传递的, 参数大小无限制的.-->   <form action="" method="post">用户名: <input type="text" name="username">年龄: <input type="text" name="age"><input type="submit" value="提交"></form></body>
</html>
<label><input type="checkbox" name="hobby" value="java"> java </label>
label使得java也可以被点击选中

表格标签

标签描述
<table>定义表格整体
<thead>用于定义表格头部(可选)
<tbody>定义表格中的主体部分(可选)
<tr>表格的行,可以包裹多个 <td>
<td>表格单元格(普通),可以包裹内容;如果是表头单元格,可以替换为 <th>

JS

引入方式

  1. JS 引入方式
    • 内部脚本:将 JS 代码定义在 HTML 页面的 <script></script>中(<body>的底部)
    • 外部脚本:将 JS 代码定义在 JS 文件中,通过<script src=""></script>标签引入
  2. JS 书写规范
    • 结束符:每行结尾以分号结尾,结尾分号可有可无

基础语法

变量 / 常量
  • 特点: JS 是弱类型语言,变量可以存放不同类型的值
  • 声明:
    • let: 声明变量
    • const: 声明常量,一旦声明,常量的值不能改变
  • 注意:
    • 在早期的 js 中,声明变量还可以使用 var,但是并不严谨 (不推荐)
输出语句
  • window.alert () : 弹出警告框(使用频次较高)
  • console.log () : 写入浏览器控制台(使用频次较高)
  • document.write () : 向 HTML 的 body 内输出内容
数据类型

原始数据类型:

数据类型描述
number数字(整数、小数、NaN(Not a Number))
string字符串,单双引('...')、双引号("...")、反引号(`...`)皆可,正常使用推荐单引号
boolean布尔。true,false
null对象为空。 JavaScript 是大小写敏感的,因此 null、Null、NULL是完全不同的
undefined当声明的变量未初始化时,该变量的默认值是 undefined

反引号:

对于字符串类型的数据,除了可以使用双引号("...")、单引号('...')以外,还可以使用反引号 (``)。 而使用反引号引起来的字符串,也称为 模板字符串

  • 模板字符串的使用场景:拼接字符串和变量。

  • 模板字符串的语法:

    • `...` :反引号 (英文输入模式下键盘 tab 键上方波浪线 ~ 那个键)

    • 内容拼接时,使用 ${ } 来引用变量

具体示例如下:

  <script>let name = 'Tom';let age = 18;console.log('大家好, 我是新入职的' + name + ', 今年' + age + '岁了, 请多多关照'); //原始方式 , 手动拼接字符串console.log(`大家好, 我是新入职的${name}, 今年${age}岁了, 请多多关照`); //使用模板字符串方式拼接字符串</script>
函数

1、

function add(a,b){return a + b;
}
let result = add(10,20);
alert(result);

2.1、匿名函数

let add = function(a,b){return a + b;
}

2.2、箭头函数

let add = (a,b) => {return a + b;
}
  • 注意:JS 是弱类型语言,定义函数时,形参、返回值都无需指定类型
自定义对象

语法格式:

let 对象名 = {属性名1: 属性值1,属性名2: 属性值2,属性名3: 属性值3,方法名称: function(形参列表){}  //:function可省略
};

注意:在自定义对象中的方法时,尽量不要使用箭头函数(this会指向父级对象)。

JSON

JSON对象:JavaScript Object Notation,JavaScript对象标记法。JSON是通过JavaScript标记法书写的文本。其格式如下:

{"key":value,"key":value,"key":value
}

其中,key必须使用引号并且是双引号标记,value可以是任意数据类型。

  • JSON.stringify(...):作用就是将js对象,转换为json格式的字符串。
  • JSON.parse(...):作用就是将json格式的字符串,转为js对象。

DOM

什么是 DOM ?

  • 文档对象模型,JS 提供的专门用来操作网页内容的

如何获取 DOM 对象 ?

  • document.querySelector (' 选择器 ')
  • document.querySelectorAll (' 选择器 ')
<body><h1 id="title1">11111</h1><h1>22222</h1><h1>33333</h1><script>//1. 修改第一个h1标签中的文本内容//1.1 获取DOM对象// let h1 = document.querySelector('#title1');//let h1 = document.querySelector('h1'); // 获取第一个h1标签let hs = document.querySelectorAll('h1');//1.2 调用DOM对象中属性或方法hs[0].innerHTML = '修改后的文本内容';</script>
</body>

JS事件监听

JS事件监听的语法:

事件源.addEventListener('事件类型', 要执行的函数);

在上述的语法中包含三个要素:

  • 事件源: 哪个dom元素触发了事件, 要获取dom元素

  • 事件类型: 用什么方式触发, 比如: 鼠标单击 click, 鼠标经过 mouseover

  • 要执行的函数: 要做什么事

<body><input type="button" id="btn1" value="点我一下试试1"><input type="button" id="btn2" value="点我一下试试2"><script>document.querySelector("#btn1").addEventListener('click', ()=>{alert("按钮1被点击了...");})</script>
</body>

常见事件

Vue3

Vue快速入门

<body><div id="app">{{message}}</div><script type="module">import { createApp } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'createApp({data(){return {message: 'Hello Vue'}}}).mount('#app')</script>
</body>

在上述入门程序编写时,需要注意这么几点:

  • Vue中定义数据,必须通过data方法来定义,data方法返回值是一个对象,在这个对象中定义数据。

  • 插值表达式中编写的变量,一定是Vue中定义的数据,如果插值表达式中编写了一个变量,但是在Vue中未定义,将会报错 。

  • Vue应用实例接管的区域是 '#app',超出这个范围,就不受Vue控制了,所以vue的插值表达式,一定写在 <div id="app">...</div> 的里面 。

Vue指令

  • v-for

作用:列表渲染,遍历容器的元素或者对象的属性

语法:<tr v-for="(item,index) in items" :key="item.id">{{item}}</tr>

参数:

  • items 为遍历的数组

  • item 为遍历出来的元素

  • index 为索引/下标,从0开始 ;可以省略,省略index语法: v-for = "item in items"

key:

  • 作用:给元素添加的唯一标识,便于vue进行列表项的正确排序复用,提升渲染性能

  • 推荐使用id作为key(唯一),不推荐使用index作为key(会变化,不对应)

注意:遍历的数组,必须在data中定义; 要想让哪个标签循环展示多次,就在哪个标签上使用 v-for 指令。

  • v-bind

作用:动态为HTML标签绑定属性值,如设置href,src,style样式等。(插值表达式不能在标签内使用)

语法:v-bind:属性名="属性值" <img v-bind:src="item.image" width="30px">

简化::属性名="属性值" <img :src="item.image" width="30px">

注意:v-bind 所绑定的数据,必须在data中定义/或基于data中定义的数据而来。

  • v-if & v-show

作用:这两类指令,都是用来控制元素的显示与隐藏的

v-if:

  • 语法:v-if="表达式",表达式值为 true,显示;false,隐藏

  • 原理:基于条件判断,来控制创建或移除元素节点(条件渲染)

  • 场景:要么显示,要么不显示,不频繁切换的场景

  • 其它:可以配合 v-else-if / v-else 进行链式调用条件判断

注意:v-else-if必须出现在v-if之后,可以出现多个; v-else 必须出现在v-if/v-else-if之后 。

v-show:

  • 语法:v-show="表达式",表达式值为 true,显示;false,隐藏

  • 原理:基于CSS样式display来控制显示与隐藏

  • 场景:频繁切换显示隐藏的场景

  • v-model

作用:在表单元素上使用,双向数据绑定。可以方便的 获取设置 表单项数据

语法:v-model="变量名"

这里的双向数据绑定,是指 Vue中的数据变化,会影响视图中的数据展示 。 视图中的输入的数据变化,也会影响Vue的数据模型 。

注意:v-model 中绑定的变量,必须在data中定义。

  • v-on

作用:为html标签绑定事件(添加时间监听)

语法:

  • v-on:事件名="方法名"

  • 简写为 @事件名="…"

  • <input type="button" value="点我一下试试" v-on:click="handle">

  • <input type="button" value="点我一下试试" @click="handle">

这里的handle函数,就需要在Vue应用实例创建的时候创建出来,在methods定义。

注意: methods函数中的this指向Vue实例,可以通过this获取到data中定义的数据。

Ajax

概述:

Ajax: 全称Asynchronous JavaScript And XML,异步的JavaScript和XML。其作用有如下2点:

  • 与服务器进行数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。

  • 异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用的校验等等。

同步异步

针对于上述Ajax的局部刷新功能是因为Ajax请求是异步的,与之对应的有同步请求。接下来我们介绍一下异步请求和同步请求的区别。

  • 同步请求发送过程如下图所示:

浏览器页面在发送请求给服务器,在服务器处理请求的过程中,浏览器页面不能做其他的操作。只能等到服务器响应结束后才能,浏览器页面才能继续做其他的操 作。

  • 异步请求发送过程如下图所示:

浏览器页面发送请求给服务器,在服务器处理请求的过程中,浏览器页面还可以做其他的操作。

Axios

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Axios入门程序</title>
</head>
<body><button id="getData">GET</button><button id="postData">POST</button><script src="https://unpkg.com/axios/dist/axios.min.js"></script><script>//GET请求document.querySelector('#getData').onclick = function() {axios({url:'https://mock.apifox.cn/m1/3083103-0-default/emps/list',method:'get'}).then(function(res) {console.log(res.data);}).catch(function(err) {console.log(err);})}//POST请求document.querySelector('#postData').onclick = function() {axios({url:'https://mock.apifox.cn/m1/3083103-0-default/emps/update',method:'post'}).then(function(res) {console.log(res.data);}).catch(function(err) {console.log(err);})}</script>
</body>
</html>
  • 请求方法别名

Axios还针对不同的请求,提供了别名方式的api,具体格式如下:

axios.请求方式(url [, data [, config]])

具体如下:

方法描述
axios.get(url [, config])发送get请求
axios.delete(url [, config])发送delete请求
axios.post(url [, data[, config]])发送post请求
axios.put(url [, data[, config]])发送put请求

异步变同步:

如果使用axios中提供的.then(function(){....}).catch(function(){....}),这种回调函数的写法,会使得代码的可读性和维护性变差。 而为了解决这个问题,我们可以使用两个关键字,分别是:async、await

可以通过async、await可以让异步变为同步操作。async就是来声明一个异步方法,await是用来等待异步任务执行。

  • 代码修改前:
search() {//基于axios发送异步请求,请求https://web-server.itheima.net/emps/list,根据条件查询员工列表axios.get(`https://web-server.itheima.net/emps/list?name=${this.searchForm.name}&gender=${this.searchForm.gender}&job=${this.searchForm.job}`).then(res => {this.empList = res.data.data})},
  • 代码修改后:
  async search() {//基于axios发送异步请求,请求https://web-server.itheima.net/emps/list,根据条件查询员工列表const 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;},

Vue生命周期

vue的生命周期:指的是vue对象从创建到销毁的过程。

vue的生命周期包含8个阶段:每触发一个生命周期事件,会自动执行一个生命周期方法,这些生命周期方法也被称为钩子方法。其完整的生命周期如下图所示:

状态阶段周期
beforeCreate创建前
created创建后
beforeMount挂载前
mounted挂载完成
beforeUpdate更新前
updated更新后
beforeDestroy销毁前
destroyed销毁后

其中我们需要重点关注的是mounted。

mounted:挂载完成,Vue初始化成功,HTML页面渲染成功。以后我们一般用于页面初始化自动的ajax请求后台数据

http://www.dtcms.com/a/285661.html

相关文章:

  • Python网络爬虫实现selenium对百度识图二次开发以及批量保存Excel
  • unity实现梦日记式效果
  • CS课程项目设计3:支持AI人机对战的井字棋游戏
  • 「Java EE开发指南」如何用MyEclipse创建企业应用项目?(一)
  • UniApp -- 小程序自定义导航栏组件
  • 小程序常用api
  • 2025年算法备案发号规律总结与下半年发号预测
  • js中 new Set()实例的各个api使用
  • Http请求中的特殊字符
  • iOS加固工具有哪些?项目场景下的组合策略与实战指南
  • Axios泛型参数解析与使用指南
  • 谷歌地球与ArcGIS Pro查看三维地形
  • Linux操作系统之线程:分页式存储管理
  • VR平台应该具备哪些功能?怎样选择VR平台?
  • RecyclerView与ListView深度对比分析
  • 相机光学(五十)——Depth AF
  • Visual Studio编译WPF项目生成的文件介绍
  • 相机的内外参分别指什么
  • AI生成邮件发送脚本(带附件/HTML排版)与定时爬取网站→邮件通知(价格监控原型)
  • Maven学习总结(62)—— Maven 打包瘦身和提速解决方案
  • [JS逆向] 微信小程序逆向工程实战
  • 7.18 Java基础 |
  • CentOS7/Redhat7破解Root密码(linux)
  • 进阶数据结构:红黑树
  • 解锁 Java 并发编程的奥秘:《Java 并发编程之美》中的技术亮点与难题攻克
  • Java Map 集合详解:从基础语法到实战应用,彻底掌握键值对数据结构
  • 【PTA数据结构 | C语言版】左堆的合并操作
  • 异世界历险之数据结构世界(排序(插入,希尔,堆排))
  • Webpack 项目优化详解
  • uniapp微信小程序 实现swiper与按钮实现上下联动