前端三板斧
前端的主要技术核心:虚拟机 + 渲染引擎
| 前端主要工作 | 功能实现 |
|---|---|
| 数据获取 | 应用层调用网络操作请求数据 |
| 状态管理 | 各种框架 + runtime宿主环境虚拟机 |
| 页面渲染 | 把相关图元信息通过图形API发给GPU渲染 |
Web前端发展历程
| 时间 | 获取数据 | 状态管理 | 页面渲染 |
|---|---|---|---|
| 1995 | HTTP/1.0 | 第一版JS | 裸露的HTML标签 |
| 2005 | HTTP/1.1 和 AJAX | JS表单+特效 | CSS 美化页面 |
| 2010 | HTTP/1.1 和 AJAX | jQuery操作DOM处理前端逻辑 | CSS 美化页面 |
| 2015 HTML5标准推广 浏览器性能提升 | HTTPS HTTP/2 WebSocket | Angular React 状态驱动视图理念 Vue | CSS3 Canvas 音、视频 |
前端常用
| 标题 | 说明 | 备注 |
|---|---|---|
| HTML | 定义网页结构和内容 最大特点:支持超链接 | 标签及属性 元素分类:块级、行内、行内块 |
| CSS | 定义网页样式 | 语法:选择器{ 属性名: 属性值;} 文档流与脱离 布局(平面分布)flex、grid 定位(垂直于平面)position 动画 |
| URL | 互联网地址 表示各种资源 | HTTP协议:用于客户端和服务器之间通信 规定其格式 域名 端口 |
| JavaScript | 定义网页与用户交互 | ES 变量 let和const 变量声明、表达式、运算符、数据类型 数组的操作 DOM(浏览器提供操作网页结构的API) BOM(浏览器提供和网页结构无关的API) |
| Node.js | 一个多技术组合的平台 让JS能调用系统接口,开发后端应用 | Node.js不是后端框架和编程语言 是JS运行环境,让其运行在服务端的开发平台 分为 http模块、fs模块、steam模块 |
| 前后分离 | AJAX 浏览器上的功能 Promise 跨域 | AJAX 无刷新网页获取数据 AJAX库有jQuery和axios实现跨域的方法: JSONP(兼容IE) CORS(提前声明共享数据) Proxy代理:允许客户端通过网络代理与服务器进行非直接的连接,需在 vue.config.js文件中配置changeOrigin: true前后端交互:登录状态保持 注册时,用户名和密码被b站保存到数据库,下次登录时核验,Cookie是实现每次HTTP请求都自动带数据给服务器的技术,第一次请求时服务器设置,然后保存在浏览器,以后每次都带上cookie 数据都保存在环境内存中,刷新或重启后,一切数据会回到刚打开的状态。所以用浏览器的 localStorage函数来保存和查询数据。本地存储 localStorage,替换为fetch网络通信函数 |
| MVC | 设计模式 | 代码模块化分成3个对象Model操作所有数据,View所有UI界面,Controller负责其他 MVVM = MVC + 双向绑定 即把一堆杂乱数据,和一堆DOM结构,通过Vue实例连接起来 |
| Webpack | 前端工程化解决方案 | |
| Vue | 构建用户界面的JS框架,将数据转换为界面 | 核心思想是: 一、声明式编码:数据驱动视图,不操作DOM 二、组件化 组件通信:父组件引入子组件,绑定数据;子组件用 props接收Vue模板(V)承接界面: 插值语法(解析标签体):可读取 data中所有属性指令语法(解析标签/绑定事件): 数据绑定 v-bind和v-model条件渲染 v-if和v-show列表渲染 v-for添加事件 v-onVue实例对象(VM): vm对象封装了对视图层的所有操作,包括数据读写、事件绑定、DOM更新el关联实例与容器、data(M)、methods、computed、watched、props、生命周期钩子:Vue 在关键时刻帮我们调用的一些特殊名称的函数 Vue router Vuex全局状态管理 核心是store,由state/getter、mutation/action组成 Vue3 组合式API(适用大型项目) 在 setup 函数中使用,setup是启动页面后自动执行的函数,但在其中定义的变量和方法,要return才能使用,通过setup的返回值来替代data选项,其中参数为setup(props, context){} |
跨平台解决方案
| 标题 | 内容 |
|---|---|
| UniApp | 基于 Vue 语法 + 微信小程序 API 集成 Weex 的SDK 实现App端原生渲染能力 |
| Flutter | Google 2017发布 Dart语言 |
| React Native | Facebook 2015发布 JS语言 |
H5
广义H5 指HTML5,第五代超文本标记语言,用于写网页代码。还有基于H5和响应式设计的前端框架:Bootstrap;
狭义H5,互动形式的多媒体广告页面,也就是用于营销传播的手机页面。
Uni-app 常用资源
常见报错和坑
- 无法在 HBuilderx中启动小程序
在微信开发者工具中设置打开安全端口
- 启动 Uniapp 小程序出现错误
在uniapp 中manifest.json找到微信小程序配置,填写 wxid 即可,测试号:wx181cc686ca3cdee7
- uni.request时需加上
header字段,否则登陆页面可能不跳转:
uni.request({
url: baseUrl + 'login/login',
method: "POST",
data: this.form,
header: {
'content-type': 'application/x-www-form-urlencoded',
},
...
Uni-app 基础
基础标签
// 需有至少一个根组件`<View>`标签
<View>
<View>相当于html中的div</View>
<text>相当于html中的span</text>
</View>
媒体组件
// aspectFit 完整比例显示
<image src="" mode="aspectFit">
样式
rpx 即响应式 px,根据平面宽度自适应的动态单位。
不可使用*全局样式选择器。
生命周期
Uni-app支持 Vue 实例生命周期、应用生命周期、页面生命周期
| 生命周期 | 说明 |
|---|---|
| onLanuch 应用生命周期 | uni-app初始化完成时触发(仅一次) |
| onShow | 应用显示了 |
| onHide | 应用隐藏了 |
| onload 页面生命周期 | 页面加载了 |
| onPullDownRefresh | 监听用户下拉动作,用于下拉刷新 |
| onReachButtom | 页面触底了 |
网络请求
Vue 用axios发起网络请求
uniapp 用uni.request发起网络请求:
<template>
<view>
<view v-for="item in picurl" :key="item.id">
<image :src="item.url" @click="getPicUrl" mode="aspectFill"></image>
</view>
</view>
</template>
<script>
export default {
data() {
return {
picurl: []
}
},
methods: {
getPicUrl() {
uni.showLoading({
title: "数据疯狂加载中..."
})
uni.request({
url: 'https://jsonplaceholder.typicode.com/posts/1',
success: res => {
console.log(res)
},
method: "get",
fail: err => {
console.log(err)
},
complete: () => {
uni.hideLoading()
}
})
}
},
onLoad() {
this.getPicUrl()
},
}
</script>
数据缓存
// uni.setStorage 异步接口 将数据存储在本地缓存中指定的key中,覆盖原key对应内容
// uni.setStorageSync 同步接口 将数据存储在本地缓存中指定的key中,覆盖原key对应内容
<template>
<view>
<button type="primary" @click="setStor">存储数据</button>
<button type="primary" @click="getStorage">获取数据</button>
</view>
</template>
<script>
export default {
data() {
return {
}
},
methods: {
setStor() {
uni.setStorage({
key:'id',
data:100,
success(){
console.log('存储成功')
}
}),
getStorage() {
uni.getStorage({
key:'id',
success(res){
console.log('获取成功', res.data)
}
})
...
条件注释
#ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #endif 结尾
导航跳转
uni-app 有两种页面路由跳转方式:使用navigator组件跳转、调用API跳转。
methods:{
goDetail(){
// navigator: 保留当前页面,跳转到应用内的某个页面
uni.navigateTo({
url:'/pages/detail/detail'
})
},
goMessage(){
// switchTab: 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
uni.switchTab({
url:'/pages/message/message'
})
},
goMessage(){
// redirecTo:关闭当前页面,跳转到应用内的某个页面。
uni.redirecTo({
url:'/pages/message/message'
})
},
}
Uni-app 组件
组件创建
// 1. 创建目录,新建组件文件
// 2. 在其他组件中导入该组件并注册
import login from "@/components/test.vue"
...
components:{test}
// 3. 使用组件
<template>
<view>
<test></test>
...
组件通信
父传子
父用属性绑定的形式传递,子用props接收。
// 父组件 title 数据传递给子组件
<template>
<view>
<test :title="title"></test>
...
import test from "@/components/test.vue"
...
data(){
return{
title:"Hello"
}
},
components:{test}
// 子组件 接收 title 数据
...
这是父组件传来的数据{{title}}
data(){},
props:[
'title'
]
子传父
子用$emit触发事件进行传递参数
// 子组件 接收 title 数据
...
<button @click="sendNum">给父组件传值</button>
data(){
return {
num:3
}
},
props:[
'title'
],
methods(){
sendNum(){
this.$emit('myEvent', this.num)
}
}
// 父组件注册 myEvent 事件
<test :title="title" @myEvent="getNum"></test>
这是子组件传递来的数据{{ num }}
data(){
return{
num: 0,
}
},
methods(){
getNum(num){
this.num = num
}
}
Uni-app 组件库
使用 HBuilderX 导入插件
后台接口API
常见格式是:域名/api/具体接口
举例:
获取到的banner轮播图image路径完整格式为:域名 + img 对应路径
商城项目实践
创建uni-app项目,调试运行在浏览器和小程序环境中。
鸣谢
卤蛋实验室作者的文章:跨端框架的核心技术到底是什么
后端api,bezx.rdsskj.cn/api/ShopWeb… data.act.icon目前为空,想加几个icon图标:
codefun-proj-user-res-1256085488.cos.ap-guangzhou.myqcloud.com/64266efb99e…