前端发展介绍
1.以往的前端:
使用 HTML(5)、CSS(3)、JavaScript(ES5、ES6、ES13),编写一个个的页面 -> 给后端(PHP、Python、Go、Java) -> 后端嵌入模板语法 -> 后端渲染完数据 -> 返回数据给前端 -> 在浏览器中查看
2.Ajax的出现:
后台发送异步请求,Render+Ajax混合
3.Angular框架的出现:
出现了“前端工程化”的概念(前端也是1个工程、1个项目)
4.React、Vue框架:
移动开发(Android+IOS) + Web(Web+微信小程序+支付宝小程序) + 桌面开发(Windows桌面):前端 -> 大前端(一套代码在各个平台运行)
5.uni-app
在Vue框架的基础性上的 uni-app:一套编码 编到10个平台
Vue快速使用
# Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架
-可以一点一点地使用它,只用一部分,也可以整个工程都使用它
1.开发Vue编辑器的选择
-vscode:微软 轻量级编辑器,免费
-vim:装插件,搞得花里胡哨,开发代码
-Jetbrains:IDEA(java),Pycharm,Goland,phpStrom,webstorm 收费 吃内存(java开发)
-AndroidStadio:免费,谷歌买了Jetbrains授权+ADT
-sun:java---》后来被甲骨文收购了--->oracle jdk openjdk 毕昇jdk
-Pycharm + 插件 开发vue 使用起来跟webstorm
-把vue的源代码下载到本地
2.M-V-VM思想:Model、View、ViewModel
- MTV :django
- MVC :后端框架一般基于这种架构
- MVVM:前端框架 vue
- MVP:移动端
3.组件话开发、单页面开发
-组件化开发:有自己独立的html,css,js
-单页面应用(SPA):只有一个html页面
插值语法
被vue托管的标签中可以写{{}}
{{}}中可以写:变量、简单的js表达式、函数
{{}}不会自动渲染链接 所以不存在xss攻击
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
// cdn引入
</head>
<body>
<div id="app">
<h1>vue插值渲染变量</h1>
<p>名字:{{name}}</p>
<p>爱好:{{hobby}}</p>
<p>第1个爱好:{{hobby[1]}}</p>
<p>wife:{{wife}}</p>
<p>wife的名字:{{wife.name}}</p>
<p>标签字符串:{{a}}</p>
<h1>vue插值语法渲染简单表达式</h1>
<p>{{10>9?'大于':'小于'}}</p>
<p>{{wife.age+1}}</p>
</div>
</body>
<script>
let vm = new Vue({
el: '#app',
data: {
name: 'jixing',
age: 20,
hobby: ['篮球', '足球', '乒乓'],
wife: {name: 'Taylor Swift', age: 20},
a: '<a href="www.baidu.com">点我去百度</a>'
},
})
// 三木运算符:相当于python中的三元表达式
// var a = 10 > 9 ? '大于' : '小于'
// ?前的表达式成立 取 : 前的值, 否则取 : 后面的值
</script>
</html>
文本指令
vue的指令: 可以写在任意标签上 以 v-xx 开头的,都是vue的指令
# 文本指令:
v-text: 把变量(文本)渲染到标签中,如果之前有数据则覆盖掉
v-html: 如果渲染对象是'标签字符串', 会把该字符串渲染成相应的标签
v-show: 控制标签的显示与隐藏,本质是通过style属性控制的。-->style="display: none;"
v-if: 控制标签的显示与隐藏,本质是通过dom的增加和删除来实现的
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h1>文本指令 v-text</h1>
<p v-text="name">彭于晏</p>
<h1>文本指令 v-html</h1>
<p v-html="a"></p>
<h1>文本指令 v-show</h1>
<p v-show="b">彭于晏</p>
<h1>文本指令 v-if</h1>
<p v-if="c">彭于晏</p>
</div>
</body>
<script>
let vm = new Vue({
el: '#app',
data: {
name: 'jixing',
a: '<a href="www.baidu.com">点我去百度</a>',
b: true,
c: false
}
})
</script>
</html>
事件指令
放在标签上 v-on:事件名 = '函数'
事件名可以写:click,dbclick,change,blur...
语法糖:
v-on:事件名='函数' 可以简写为: @事件名='函数'
补充:
1.es6 对象的写法
var namr = 'jixing'
var age = 19
// var obj = {name:name, age:age, handleClick: function(){}}
var obj = {name, age, handleClick() {}}
2.事件指令函数传值问题
js中函数参数多传少传都不会报错。
1.函数需要1个参数参数但是没传,默认会把event事件当做参数传入
2.函数需要多个参数但是没传,默认会把event事件当做第一个参数,剩下的参数为undefined
3.函数需要多个参数但是没传够,传几个就用几个,不足的参数为unidefined
4.若函数需要用到event,可以这样传:handleClick3($event,'lqz')
<div id="app">
<h1>事件指令</h1>
<button v-on:click="handleShow">点我显示消失</button>
<div v-if='show'>
<img src="https://tva1.sinaimg.cn/large/00831rSTly1gd1u0jw182j30u00u043b.jpg" alt="" width="300px"
height="300px">
</div>
<h1>事件指令函数带参数</h1>
<button @click="handleClick">函数需要参数,但是没传,默认会把event事件传入 </button>
<br>
<button @click="handleClick1('lqz')">函数需要参数,但是传值了</button>
<br>
<button @click="handleClick2('lqz')">函数需要3参数,但是传了1个</button>
<br>
<button @click="handleClick3($event,'lqz')">函数需要2参数,一个事件,一个字符串</button>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
show: true,
},
methods: {
// handleShow: function () {
// // this 就是vm对象 vm.show
// this.show = !this.show
// },
//es6的语法,对象写法,以后都这样写
handleShow() {
// this 就是vm对象 vm.show
this.show = !this.show
},
// 需要一个参数,但是没有传,会把事件传入
handleClick(a) {
console.log(a)
alert('帅哥')
},
// 需要1个,传了一个,但是需要传数字,字符串,布尔,或变量
handleClick1(name) {
console.log(name)
},
// 需要3个参数,传了一个,没问题,后面俩都是 undefined
handleClick2(a, b, c) {
console.log(a)
console.log(b)
console.log(c)
},
handleClick3(event,name){
console.log(event)
console.log(name)
}
}
})
// es5中
// var obj={'name':'lqz','age':19}
// var obj={name:'lqz',age:19}
// es6中
var name = 'lqz'
var age = 19
// var obj={name:name,age:age}
var obj = {
name, age, handleClick() {
}
}
</script>
属性指令
# 写在标签上的name class href src id ... 属性
v-bind:属性名='变量'
v-bind指令主要用于响应式的更新html属性
语法糖: :属性名="变量"
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="./js/vue.js"></script>
</head>
<body>
<div id="app">
<h1>属性指令</h1>
<button @click="handleClick">点我看美女</button>
<br>
<img v-bind:src="url" alt="" width="300px" height="300px">
<hr>
<button @click="handleChange">点我换美女</button>
<br>
<img :src="img_url" alt="" width="300px" height="300px">
<hr>
<img :src="img_url2" alt="" width="300px" height="300px">
<hr>
<div :id="id_div">
我是div
</div>
</div>
</body>
<script>
var vm = new Vue({
el: "#app",
data: {
url: 'https://tva1.sinaimg.cn/large/00831rSTly1gd1u0jw182j30u00u043b.jpg',
img_url: 'https://p.qqan.com/up/2022-8/202283919254843.jpg',
img_url2: 'https://tva1.sinaimg.cn/large/00831rSTly1gd1u0jw182j30u00u043b.jpg',
imgList: ['https://img2.woyaogexing.com/2022/10/23/af963193e9fb67ee!400x400.jpg',
'https://img2.woyaogexing.com/2022/10/22/95afdd5cd39d556d!400x400.jpg',
'https://img2.woyaogexing.com/2022/10/21/f06c65142fe50c19!400x400.jpg',
'https://img2.woyaogexing.com/2022/10/20/c0135f7e74050a74!400x400.jpg',
'https://img2.woyaogexing.com/2022/10/20/5972f09505ac681d!400x400.jpg'],
id_div:'xxx'
},
methods: {
handleClick() {
this.url = 'https://p.qqan.com/up/2022-8/202283919254843.jpg'
},
handleChange() {
// floor:只取整数部分
//Math.random() 生成0--1直接的数字,小数
var i = Math.floor(Math.random() * this.imgList.length)
console.log(i)
this.img_url = this.imgList[i]
}
},
mounted() {
// 页面加载完,开启一个定时器,每隔3s干函数内容,函数里面在变化变量
setInterval(() => {
var i = Math.floor(Math.random() * this.imgList.length)
this.img_url2 = this.imgList[i]
}, 1000)
}
})
</script>
</html>