vue发布于2013年,是一个渐进式的框架, 同时也是一个轻量级的框架,它只关心数据,从而让开发者不用过多的关注DOM的改变和操做DOM,vue的做者为Evan You(尤雨溪),任职于Google Creative Labhtml
DOM:document object model(文档对象模型)也就是操做html或xml的通用编程接口,这里不过分描述前端
// html
<body>
<div id="app">
<input type="text" v-model="note">
<p>{{ note }}</p>
</div>
</body>
// js
var app = new Vue({
el: '#app',
data: {
note: ''
}
})
复制代码
对比其它web前端框架,vue更容易上手,代码和API更为简洁和直观,且速度更快!vue
vue最精髓的,正是它的组件与组件化,写一个 Vue 工程,其实就是在写一个个的组件。web
一个组件的复杂与否,都是由三部分组成的,==prop(属性)==,==event(事件)==,==slot(插槽)==,必需要先设计好这三部分,才能继续开发组件,不然,代码一旦发布,后面再修改API就很困难了,组件的维护都是以新增功能为主,而不是常常变动接口;vue-router
prop 定义了这个组件有哪些可配置的属性,组件的核心功能也都是它来肯定的。写通用组件时,props 最好用对象的写法,这样能够针对每一个属性设置类型、默认值或自定义校验属性的值,这点在组件开发中很重要,然而不少人却忽视,直接使用 props 的数组用法,这样的组件每每是不严谨的。编程
例如:收银端的打印弹框组件(部分代码已简略)数组
<template>
<!--打印-->
<el-dialog
:show-close="false"
:visible="visiable"
:closeOnClickModal="false"
custom-class="zbe-dialog chose-sale"
width="1000px"
center
>
<p slot="title" class="zbe-dialog-title">打印单据</p>
<div class="box">
<el-row style="margin-top:10px">
<el-col :span="24" v-if="!web_view_error" v-loading="loading">
<!-- 预览窗口 -->
<webview
ref="view"
id="view"
:src="visiable?data_web_view_url:' '"
autosize
plugins
disablewebsecurity
allowpopups
style="display:inline-flex; width:100%;height:400px;"
></webview>
</el-col>
<!-- 打印加载失败提示 -->
<el-col :span="24" v-if="web_view_error&&!loading">打印加载失败</el-col>
</el-row>
<!-- 关闭按钮 -->
<el-row>
<el-col :span="11" :offset="20" style="margin-top:20px">
<el-button @click="doCancle">关闭</el-button>
</el-col>
</el-row>
</div>
</el-dialog>
</template>
<script>
export default {
name: "print",
props: {
// 控制组件的显示隐藏
show: {
type: Boolean,
default: false
},
// 打印URL
web_view_url: "",
// 关闭打印后的跳转地址
web_view_reback_path: "",
// 是否打印加载失败
web_view_error: false
},
data() {
return {
visiable: false,
domReady: true,
data_web_view_url: "/",
loading: false
};
},
methods: {
// 关闭后跳到传过来的path
doCancle() {
this.$emit("dailog-close", "printDialogVisible");
this.$router.push({ name: this.web_view_reback_path });
}
},
watch: {
show(item) {
this.visiable = item;
},
web_view_url(newValue, oldValue) {
this.loading = true;
this.data_web_view_url = "/";
setTimeout(() => {
this.data_web_view_url = newValue;
}, 200);
this.loading = false;
},
}
};
</script>
复制代码
组件中定义了4个prop,分别是==show==(控制组件的显示隐藏),==web_view_url==(打印URL),==web_view_reback_path==(关闭打印后的跳转地址),==web_view_error==(是否打印加载失败)缓存
值得注意的是,组件里定义的prop都是单向数据流,只能经过父级组件对齐进行修改,组件自己不能修改props的值,只能修改定义在data里的数据,非要修改,也是经过后面介绍的自定义事件通知父级,由父级来修改;bash
先看下代码前端框架
<template>
<button>
<slot name="icon"></slot>
<slot></slot>
</button>
</template>
复制代码
这里的节点就是指定的一个插槽的位置,这样在组件内部就能够扩展内容了;
<i-button>
<i-icon slot="icon" type="checkmark"></i-icon>
按钮 1
</i-button>
复制代码
这样,父级内定义的内容,就会出如今组件对应的 slot 里,没有写名字的,就是默认的 slot;
仍是先看代码
<template>
<button @click="handleClick">
<slot></slot>
</button>
</template>
<script>
export default {
methods: {
handleClick (event) {
this.$emit('on-click', event);
}
}
}
</script>
复制代码
在组件中能够经过$emit触发自定义事件on-click,在父组件经过@on-click来监听
<i-button @on-click="handleClick"></i-button>
复制代码
Vue 的组件做用域都是孤立的,不容许在子组件的模板内直接引用父组件的数据。必须使用特定的方法才能实现组件之间的数据传递
父组件向子组件的通讯方式能够经过props传递: 若是须要从父组件获取 username 的值,就须要
props:{
username:{
}
}
复制代码
子组件向父组件传递数据则能够经过event传递:
methods:{
handelSwitch(index){
this.actIndex=index;
this.$emit("transferTabIndex",this.actIndex)
}
}
复制代码
eventBus这种通讯方式,针对的是非父子组件之间的通讯,它的原理仍是经过事件的触发和监听;
可是由于是非父子组件的关系,他们须要有一个中间组件来链接;
我是使用的经过在根组件,也就是#app组件上定义了一个全部组件均可以访问到的组件,具体使用方式以下;
使用eventBus传递数据,咱们一共须要作3件事情
这种通讯比较简单,缺点是数据和状态比较混乱,不太容易维护;
经过window.localStorage.getItem(key) 获取数据; 经过window.localStorage.setItem(key,value) 存储数据;
注意用JSON.parse() / JSON.stringify() 作数据格式转换;