swan-ui
Version:
Vue Components for Mobile App.
400 lines (322 loc) • 9.15 kB
Markdown
Swan UI 是一个基于vuejs的移动端组件库,包含丰富的css和js组件。我们的初衷是开发一套展现一致、与业务相契合的组件库,与 [pheonix-styles](https://future-team.github.io/phoenix-styles/example/index.html) 样式库配合使用。组件库在github上开源,也欢迎大家来共同开发。
- [项目地址](https://github.com/future-team/swan-ui)
- [文档](http://future-team.github.io/swan-ui/doc/index.html)(文档工具开发中,后续会做迁移)
- [示例](http://future-team.github.io/swan-ui/examples/index.html)
- 基础类
- 表单类
- 布局类
- 弹框类
- 操作类
- 组合类
- Android 4.4 +
- IOS 8+
- Chrome
- 要求`v2.4.0`及以上
- [vue](https://cn.vuejs.org/v2/guide/)
- [vue-loader](https://vue-loader.vuejs.org/zh-cn/)
- [webpack](https://doc.webpack-china.org/concepts/)
```
npm install swan-ui --save
npm install pheonix-styles --save
```
pheonix-styles是一套遵循视觉规范的样式库,我们的vue组件库swan-ui和react组件库pheonix-ui都是基于pheonix-styles的dom结构编写的。在使用组件库时,需要引入样式库phoenix-styles。
可以在html中引入:
```xml
<link rel="stylesheet" href="http://future-team.github.io/phoenix-styles/dist/phoenix-styles.min.css" />
```
也可以在js文件中引入:
```javascript
import 'phoenix-styles/dist/phoenix-styles.css'
//或者
import 'phoenix-styles/less/phoenix-less'
```
或者在.vue文件用style标签引入:
```xml
<style lang="less" src="phoenix-styles/less/phoenix-styles.less"></style>
```
在使用组件时,我们可以自定义样式,覆盖组件样式:
```xml
<sw-button class="bg-color">按钮</sw-button>
```
如果无法覆盖,可以写成动态样式的形式:
```xml
<sw-button :class="{'bg-color':true}">默认按钮</sw-button>
```
另一种方式是直接修改phoenix-styles的样式:
```css
.ph-button-primary{
background-color: red;
}
```
还有一种方式就是使用内联样式:
```xml
<sw-button style="background-color: red;">按钮</sw-button>
```
**事件命名**
- 自定义事件以 `on-xx`开头,最多三个单词,例如 `@on-before-close`
- 自定义原生事件直接使用原声事件名,方便使用。例如 `@click`、`@change`、`@input`、`@drag`
**事件处理器命名**
- 以`handleXXX`命名,例如 handleClick、handleChange、handleInput
**slot插槽命名**
主体内容一般使用默认名defalut,不需要设置。其他slot命名一般是:
- title
- header
- footer
<img src="./image/swan-vue-webpack.png"/>
可以使用官方提供的脚手架工具 [vue-cli](https://github.com/vuejs/vue-cli)来创建项目,也可以跟着下面的步骤来创建项目。
目录结构
```
.
├── .babelrc
├── README.md
├── index.html
├── package.json
├── src
│ ├── App.vue
│ └── main.js
└── webpack.config.js
```
配置文件
.babelrc
```javascript
{
"presets": [
["es2015", { "modules": false }]
],
"plugins": ["transform-vue-jsx"]
}
```
webpack.config.js
```javascript
var path = require('path')
var webpack = require('webpack')
var ExtractTextPlugin = require("extract-text-webpack-plugin")
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'build.js'
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
extractCSS: true
}
},
{
test: /\.js$/,
use: 'babel-loader',
exclude: /node_modules/
},
{
test: /\.css$/,
use: ExtractTextPlugin.extract('css-loader')
},
{
test:/\.less$/,
use: ExtractTextPlugin.extract('less-loader')
},
{
test: /\.(eot|svg|ttf|woff|woff2)(\?\S*)?$/,
use: 'file-loader?name=../dist/iconfont/[name].[ext]'
}
]
},
devServer: {
historyApiFallback: true,
noInfo: true
},
devtool: '#eval-source-map',
plugins: [
new ExtractTextPlugin("style.css")
]
}
if (process.env.NODE_ENV === 'production') {
module.exports.devtool = '#source-map'
module.exports.plugins = (module.exports.plugins || []).concat([
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"'
}
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
})
])
}
```
package.json
```javascript
{
"name": "swan-quick-start",
"version": "1.0.0",
"description": "",
"scripts": {
"dev": "webpack-dev-server --inline --hot --port 4000",
"build": "webpack"
},
"author": "chang20159@foxmail.com",
"devDependencies": {
"babel-core": "^6.26.0",
"babel-loader": "^7.1.2",
"babel-preset-es2015": "^6.24.1",
"css-loader": "^0.28.7",
"extract-text-webpack-plugin": "^3.0.0",
"file-loader": "^0.11.2",
"less": "^2.7.2",
"less-loader": "^4.0.5",
"style-loader": "^0.18.2",
"vue-loader": "^13.0.4",
"vue-template-compiler": "^2.4.3",
"webpack": "^3.5.6",
"webpack-dev-server": "^2.7.1"
},
"dependencies": {
"phoenix-styles": "^2.0.6",
"swan-ui": "^1.0.5",
"vue": "^2.4.3"
}
}
```
在main.js中可通过如下几种方式引入需要的组件:
**整体引入**
```javascript
import Vue from 'vue'
import App from './App.vue'
import 'phoenix-styles/dist/phoenix-styles.css'
import SwanUI from 'swan-ui'
Vue.use(SwanUI)
```
**按需引入**
```javascript
import Vue from 'vue'
import App from './App.vue'
import 'phoenix-styles/dist/phoenix-styles.css'
import {Button,Image,ImageList} from 'swan-ui'
Vue.component(Button.name,Button)
Vue.component(Image.name,Image)
Vue.component(ImageList.name,ImageList)
```
**按需引入**
```javascript
import Vue from 'vue'
import App from './App.vue'
import 'phoenix-styles/dist/phoenix-styles.css'
import Button from 'swan-ui/lib/Button'
import Image from 'swan-ui/lib/Image'
import ImageList from 'swan-ui/lib/ImageList'
Vue.component(Button.name,Button)
Vue.component(Image.name,Image)
Vue.component(ImageList.name,ImageList)
```
或者在App.vue中局部注册:
```javascript
import {Button,Image,ImageList} from 'swan-ui'
export default {
name: 'App',
components: {
[]:Button,
[]:Image,
[]: ImageList
}
}
```
然后在App.vue中使用组件:
```
<template>
<div class="container">
<h4>Hello, Swan UI</h4>
<sw-image-list :column="2">
<sw-image v-for="(item,index) in images"
:key="index"
:src="item"></sw-image>
</sw-image-list>
<sw-button class="fix-bottom"
block
@click="handleClick">点我查看图片</sw-button>
</div>
</template>
<script>
import {Button,Image,ImageList} from 'swan-ui'
export default {
components: {
[]:Button,
[]:Image,
[]: ImageList
},
data(){
return{
images: null
}
},
methods:{
handleClick(){
this.images = [
'https://fuss10.elemecdn.com/b/2e/a6c333694efb4db66c6a3ba07e9d8jpeg.jpeg?imageMogr2/thumbnail/200x200/format/webp/quality/85',
'https://fuss10.elemecdn.com/e/6c/0de9d18ef47292380826be8d8cfe8jpeg.jpeg?imageMogr2/thumbnail/200x200/format/webp/quality/85',
'https://fuss10.elemecdn.com/9/78/f449290a86fb3ca7d793a5cc50344jpeg.jpeg?imageMogr2/thumbnail/200x200/format/webp/quality/85',
'https://fuss10.elemecdn.com/b/ce/fdff43a9ea94d46706be48f50bc26jpeg.jpeg?imageMogr2/thumbnail/200x200/format/webp/quality/85'
]
}
}
}
</script>
<style lang="less">
.container{
h4{
text-align: center;
margin-top: 20px;
}
}
.fix-bottom{
position: fixed;
bottom: 15px;
}
</style>
```
最后在main.js中将节点添加到id为app的dom节点:
```
new Vue({
el: '#app',
render: h => h(App)
})
```
```
npm run build
```
```
npm run dev
```
- v1.0.2 提供压缩/未压缩打包文件
- v1.0.3 修复TabSet组件无法动态更新的问题
- v1.0.4 统一事件名称、filter组件数据结构、补充文档
- v1.0.5 修复prompt默认取消按钮无法关闭问题
- v1.0.6 修复Image无法动态更新
- v1.0.7 修复Toast文字溢出 && 添加logger
- v1.0.8 修复Object.assign兼容性问题
- 基于React的移动端组件库 [phoenix-ui](https://future-team.github.io/phoenix-ui/doc/)
- 图标库 [gfs-icons](https://future-team.github.io/gfs-icons/index.html)