Vuejs前端组件化实践Radon UI
Awe
longjiawen@luojilab.com
自我介绍
龙佳文 (ID:Awe)
曾在百词斩、稀土掘金打过酱油,
对使用 Vue 开发前端应用有一些经验。
Github:hilongjw 掘金:Awe 知乎:Awee
Vue.js是⼀个MVVM前端框架
为什么选择Vue.js
- Vue.js官方文档完整、清晰
- API设计简洁
- 性能优异
- 完善的组件化支持
- 开发工具链完善
前端组件化?
前端组件化并不是一个新的概念,从古老的EXT js、YUI到现在基于的ng、react、Vue的各种组件UI框架,一直有组件化的新实践。
有人说前端圈就是爱重复造轮子,一方面是的因为前端不仅仅是机器逻辑,它还涉及到UI、UE,没有也不太可能会有统治整个前端的组件库/框架,另一方面是因为前端圈向来开放,开源已经是传统。
为什么需要组件化?
在实际项目的开发中发现会有很多地方的代码甚至UI的交互是重复的,这种情况在大型应用中这个问题会越发明显。
我们使用的Vuejs最引以为豪也它的组件(Component)功能,所以可以利用来它来封装可重用代码,来打造我们的RadonUI。
为什么需要组件化?
在实际项目的开发中发现会有很多地方的代码甚至UI的交互是重复的,这种情况在大型应用中这个问题会越发明显。
我们使用的Vuejs最引以为豪也它的组件(Component)功能,所以可以利用来它来封装可重用代码,来打造我们的RadonUI。
提高开发效率
降低了维护成本
怎么用 Vue 写可复用组件?
在典型的 Vue.js 项目中,我们会把界面拆分为多个小组件,每个组件在同一地方封装它的 CSS 样式,模板和 JavaScript 定义。
Vue单文件组件
怎么用 Vue 写可复用组件?
使用props在父子组件中传递数据
<!--parent.vue-->
<template>
<div>
<child :some="some"><child>
</div>
</template>
<script>
export default {
data () {
return {
some: {
key: 'value'
}
}
}
}
</script>
<!--child.vue-->
<template>
<p>{{some.key}}<p>
</template>
<script>
export default {
props: {
some: {
type: Object,
default () {
return {
key: 'default value'
}
}
}
}
}
</script>
怎么用 Vue 写可复用组件?
使用 slot 分发内容
<!--button.vue-->
<template>
<button class="rd-btn">
<span class="rd-btn-loading ion-load-a" v-if="loading"></span>
<span>
<slot></slot>
</span>
</button>
</template>
<script>
export default {
props: {
loading: {
type: Boolean,
default () {
return false
}
}
}
}
</script>
<!--button.vue-->
<template>
<div>
<cov-button :loading="true">
<span>这个span会出现在slot</span>
</cov-button>
</div>
</template>
<script>
import covButton from './button.vue'
export default {
components: {
covButton
}
}
</script>
web 应用需要哪些组件?
我们参考了国内外一些优秀的React、Vue的组件库(ant design、Material-ui等)并结合我们现有的业务总结了下面几个主要组件集合
- AudioPlayer 音频播放
- Button 按钮
- ButtonGroup 按钮组
- DropButton 下拉
- Card 卡片
- CardGroup 卡片组
- Chart 图表
- Icon 图标
- Table 表格
- Tag 标签
- Textfield 文本输入框
- NumberInput 数字输入框
- Checkbox 复选框
- Radio 单选框
- Switch 开关
- Slider 滑动输入
- Select 选择器
- Cascader 级联选择器
- Editable 可编辑文本
- Alert 警告提示
- Modal 对话框
- Notification 通知
- Progress 进度条
- Timeline 时间线
- Tooltip 对话框
- Spin 加载中
- Upload 上传
- Breadcrumb 面包屑
- Pagination 分页
Basic
Form
Common
Navigation
如何使用Radon UI?
npm i radon-ui --save-dev
npm 安装
如何使用Radon UI?
单一组件的引用
<template>
<rd-text :textfiled="from.username"></rd-text>
<rd-text :textfiled="from.password"></rd-text>
<rd-button>登陆<rd-button>
</template>
<script>
// once & root only
import '/radon-ui/dist/static/css/dist.css'
import {
rdButton,
rdText
} from 'radon/index'
export default {
data () {
return {
form: {
username: {
value: dashUser.get('username'),
placeHolder: '用户名',
state: 'default',
tip: ''
},
password: {
value: '',
placeHolder: '密码',
state: 'default',
tip: ''
}
}
}
},
components: {
rdButton,
rdText
},
methods: {
...
}
}
</script>
如何使用Radon UI?
全局组件的用法
<!--App.vue-->
<template>
<div class="dash-root">
<nav-header></nav-header>
<dash-container>
<router-view></router-view>
</dash-container>
<dash-footer></dash-footer>
<rd-modal :modal="modal"></rd-modal>
<rd-notification :notifications="Notifications"></rd-notification>
</div>
</template>
<script>
import 'radon-ui/dist/static/css/dist.css'
import {
rdModal,
rdNotification
} from 'radon-ui/index'
export default {
data () {
return {
Notifications: [],
modal: {
show: false,
title: '',
content: '',
cancel: () => {},
confirm: () => {}
}
}
},
created () {
this.$Radon.setRoot(this)
},
components: {
rdModal,
rdNotification
}
}
</script>
// main.js
import RadonInstall from 'radon-ui/install'
RadonInstall(Vue)
如何使用Radon UI?
全局组件的用法
<script>
// any child components
export default {
methods: {
loginAction () {
return this.$Notification.warning('登陆失败, 请再次尝试', '', 3000)
},
netError () {
this.$Modal.create('网络错误', '无法连接到服务器', () => {
console.log('confirmed')
}, () => {
console.log('canceled')
})
}
}
}
</script>
如何使用Radon UI?
全局组件的用法
<script>
// any child components
export default {
methods: {
loginAction () {
return this.$Notification.warning('登陆失败, 请再次尝试', '', 3000)
},
netError () {
this.$Modal.create('网络错误', '无法连接到服务器', () => {
console.log('confirmed')
}, () => {
console.log('canceled')
})
}
}
}
</script>
Thanks
Vuejs前端组件化实践Radon UI
By Awe
Vuejs前端组件化实践Radon UI
- 3,825