从0开始做系统之vue
我们做工程,或者做产品的时候,很多时候不需要从最基本的元素做器,直接用模块集成就可以了,这就是分工的不同。做电子产品的时候,不需要去造二极管,直接用集成电路。做食物的时候,不需要去种食材,直接用原材料加工一下就可以了。做软件也是如此。
不知道有人见过造房子或者建设工程没有。最基本的是水泥,沙子,然后跟钢精一起凝结成混凝土。如果要按照传统的方法,在施工现场,要将沙子,水泥和水按照一定的比例搅拌,然后根据一定的模具,做成构件。等构件凝固好后,才能进行下一步。
近些年中国的高铁,以及造桥技术越来越快,越来越先进。 基建狂魔的建设已经将世界甩在了后面。就是打破的传统,构件提前在工厂做好,工程中直接安装构件。这样效率就会提高很多。
这,这跟软件有什么关系? 软件工程中也可以有构件的思想。直接封装好这种构件,拿来用。 今天要给大家介绍一下vue, 它也是前端利用了构件的思想。
- Vue.js是什么? 1). 一位华裔前Google工程师(尤雨溪)开发的前端js库 2). 作用: 动态构建用户界面 3). 特点: * 遵循MVVM模式 * 编码简洁, 体积小, 运行效率高, 移动/PC端开发 * 它本身只关注UI, 可以轻松引入vue插件和其它第三库开发项目 4). 与其它框架的关联: * 借鉴angular的模板和数据绑定技术 * 借鉴react的组件化和虚拟DOM技术 5). vue包含一系列的扩展插件(库): * vue-cli: vue脚手架 * vue-resource(axios): ajax请求 * vue-router: 路由 * vuex: 状态管理 * vue-lazyload: 图片懒加载 * vue-scroller: 页面滑动相关 * mint-ui: 基于vue的组件库(移动端) * element-ui: 基于vue的组件库(PC端)
2. 基本使用
1). 引入vue.js
2). 创建Vue实例对象(vm), 指定选项(配置)对象
el : 指定dom标签容器的选择器
data : 指定初始化状态数据的对象/函数(返回一个对象)
3). 在页面模板中使用{{}}或vue指令
3. Vue对象的选项
1). el
指定dom标签容器的选择器
Vue就会管理对应的标签及其子标签
2). data
对象或函数类型
指定初始化状态属性数据的对象
vm也会自动拥有data中所有属性
页面中可以直接访问使用
数据代理: 由vm对象来代理对data中所有属性的操作(读/写)
3). methods
包含多个方法的对象
供页面中的事件指令来绑定回调
回调函数默认有event参数, 但也可以指定自己的参数
所有的方法由vue对象来调用, 访问data中的属性直接使用this.xxx
4). computed
包含多个方法的对象
对状态属性进行计算返回一个新的数据, 供页面获取显示
一般情况下是相当于是一个只读的属性
利用set/get方法来实现属性数据的计算读取, 同时监视属性数据的变化
如何给对象定义get/set属性
在创建对象时指定: get name () {return xxx} / set name (value) {}
对象创建之后指定: Object.defineProperty(obj, age, {get(){}, set(value){}})
5). watch
包含多个属性监视的对象
分为一般监视和深度监视
'xxx' : {
deep : true,
handler : fun(value)
}
另一种添加监视方式: vm.$watch('xxx', funn)
vue内置指令
v-text/v-html: 指定标签体
* v-text : 当作纯文本
* v-html : 将value作为html标签来解析
v-if v-else v-show: 显示/隐藏元素
* v-if : 如果vlaue为true, 当前标签会输出在页面中
* v-else : 与v-if一起使用, 如果value为false, 将当前标签输出到页面中
* v-show: 就会在标签中添加display样式, 如果vlaue为true, display=block, 否则是none
v-for : 遍历
* 遍历数组 : v-for="(person, index) in persons"
* 遍历对象 : v-for="value in person" $key
v-on : 绑定事件监听
* v-on:事件名, 可以缩写为: @事件名
* 监视具体的按键: @keyup.keyCode @keyup.enter
* 停止事件的冒泡和阻止事件默认行为: @click.stop @click.prevent
* 隐含对象: $event
v-bind : 强制绑定解析表达式
* html标签属性是不支持表达式的, 就可以使用v-bind
* 可以缩写为: :id='name'
* :class
* :class="a"
* :class="{classA : isA, classB : isB}"
* :class="[classA, classB]"
* :style
:style="{color : color}"
v-model
* 双向数据绑定
* 自动收集用户输入数据
ref : 标识某个标签
* ref='xxx'
* 读取得到标签对象: this.$refs.xxx
不好理解,我开始学的时候也觉得简单,看过以后就忘记了。 我们可以这样来理解,我们把前端比喻成造工程。 不管是造桥,还是造大厦,还是造图书馆,他都有一个外在的样子,和内在材料使用情况:
<div id="app">
{{ message }}
</div>
var app = new Vue({
el: '#app', //element需要获取的元素
data: {
message: 'Hello Vue!'
}
})
其中html是外在样子,JS是实际的材料使用。 为了预防偷工减料,豆腐渣工程,我们用三个方法来检测材料的使用情况,下面开始纪委,或者监理开始审计。
元素el可以理解为需要审计的项目,比如地下室。 data可以理解为施工单位的上报数据。 可以有三种方式: watch(监理每天监视) computed(计算审计) methods(通过各种技术手段) 上面可以理解为对数据的审计。
下面可以理解为对流程的审计。 v-bind 可以理解为,对谁进行责任制
<div id="app-2">
<span v-bind:title="message"> //属性绑定可以应用于好多其他标签的属性
鼠标悬停几秒钟查看此处动态绑定的提示信息!
</span>
</div>
var app2 = new Vue({
el: '#app-2',
data: {
message: '页面加载于 ' + new Date().toLocaleString()
}
})
我们可以用 v-on 指令添加一个事件监听器,比如对招投标进行流程化监督
<div id="app-5">
<p>{{ message }}</p>
<button v-on:click="reverseMessage">逆转消息</button>
</div>
var app5 = new Vue({
el: '#app-5',
data: {
message: 'Hello Vue.js!'
},
methods: {
reverseMessage: function () {
this.message = this.message.split('').reverse().join('')
}
}
})
v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定。可以理解为相互监督:
<div id="app-6">
<p>{{ message }}</p>
<input v-model="message">
</div>
var app6 = new Vue({
el: '#app-6',
data: {
message: 'Hello Vue!'
}
})
对流程的审计,也可以是三部分,对人,对事件,和双方监督。 好了,附上刚开始学习时写的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Get Password</title>
<script src="https://cdn.bootcss.com/vue/2.6.9/vue.min.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
<div id="app1">
{% raw %}
<input v-model="message">
<button type="button" @click="get_password">submit</button>
<p>account is: {{ message }}</p>
<p>password is: {{ password }}</p>
</div>
{% endraw %}
<script>
var v1 = new Vue({
el: '#app1',
data: {
message: 'stest',
password: '',
},
watch : {
my(v) {
this.password = this.get_password();
}
},
methods: {
get_password() {
axios.get('/accounts', {
headers: {
'Access-Control-Allow-Origin': '*',
},
crossDomain: true,
contentType: "application/json",
params: {
account: this.message,//接口配置参数(相当于url?id=xxxx)
},
}).then((res) => {
console.log(res.data['password']);//处理成功的函数 相当于success
this.password = res.data['password']
})
.catch(error => console.log(error))
}
}
})
</script>
</body>
</html>
后端是用flask实现的。
from flask import Flask,render_template,request,jsonify
app = Flask(__name__)
# @app.route('/')
# def hello_world():
# return render_template("index.html")
@app.route('/')
def index():
return render_template("home.html")
@app.route('/accounts', methods=['GET'])
def get_accounts():
if request.method == "GET":
username = request.args.get("account")
password = "aaa" #query_account(username)
if password == "":
return "no result"
else:
#return render_template("home.html",message=username,password=password)
return jsonify({"password": password})
if __name__ == '__main__':
app.run()
这就是构件的魔力!
更多精彩,请关注微信公众号:python爱好部落
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法