在我一辈子的黄金时代,我有好多奢望。我想爱,想吃,还想在一瞬间变整天上半明半暗的云。
——王小波
上一章研究了vue中组件的通讯,算是对vue的组件通讯有了大体的了解。综合上三章对搭建项目也算是心有成竹了,这一章我将把本身在开发整个项目时的一些总结分享给你们。css
X-chat项目github地址:https://github.com/ermu592275...
X-chat是我仿照别人项目的UI纯手打的,在这里表示感谢,同时贴上CookIM(我仿照的项目)的地址:
码云地址:http://git.oschina.net/cookee...
演示地址:https://im.cookeem.com/chat/#...html
1、关于CSS
众所周知,vue组件的css样式能够写在<style></style>中,固然也能够写成一个css文件而后link进去。
我在项目中对于CSS的写法以下:vue
1.使用bootstarp.csswebpack
安装npm install bootstarp --save
引入有两种方法:在index.html中link或者main.js也就是入口文件中improt,须要注意的是import不支持使用cdn,因此若是是cdn能够在index.html中link进来
import以下:git
// The Vue build version to load with the `import` command // (runtime-only or standalone) has been set in webpack.base.conf with an alias. import Vue from 'vue' import VueRouter from 'vue-router' import Vuex from 'vuex' import router from './router' import store from './store' import App from './App' import 'bootstrap/dist/css/bootstrap.css' //只需引入就够了 import 'animate.css/animate.css' import './base.css' Vue.use(VueRouter) console.log(store) /* eslint-disable no-new */ new Vue({ el: '#app', router, store, template: '<App/>', components: { App } })
2.使用base.css声明基本样式
我在src目录下建立了base.css将reset样式以及公共的样式都放在了base.css中,也在main.js中引入github
import './base.css'
3.在每一个组件中声明对应的样式
在每一个组件中写对应的样式,而且加上scoped显示样式的做用域,能有效的防止样式冲突,今后再也不为css样式的命名而头疼。web
<style scoped> // 加上scoped .hint { margin: 0; position: relative; width: 100%; height: 100%; z-index: 99; } .... </style>
若是要使用sass或less语法,请参考:https://segmentfault.com/a/11...vue-router
4.过渡效果vuex
组件的切换,要是能加上过渡效果就更好了。在vue中能够经过一下方式实现过渡效果:npm
在 CSS 过渡和动画中自动应用 class
能够配合使用第三方 CSS 动画库,如 Animate.css
在过渡钩子函数中使用 JavaScript 直接操做 DOM
能够配合使用第三方 JavaScript 动画库,如 Velocity.js
我在项目中使用了animate.css,用法和bootstarp十分类似,只须要安装以后在main.js中引入就能够了。
npm install animate.css --save main.js import 'animate.css/animate.css'
也使用了Vue提供的transition封装组件,transition多用在条件渲染(v-if),动态数组等情形下。
我在项目中的使用以下:
APP.vue
<template> <div> <!-- 1.使用transition组件将须要实现过渡效果的组件(也能够是元素)包裹,而且定义一个name属性 --> <transition name="listbar"> <listbar></listbar> </transition> <div class="rightpart" v-bind:style="height"> <router-view></router-view> </div> <transition name="daggerbar"> <daggerbar></daggerbar> </transition> <transition name="hinttst"> <hint></hint> </transition> </div> </template> <script> import Headerbar from './Header.vue' import Listbar from './List.vue' import Footerbar from './Footer.vue' import Daggerbar from './Dagger.vue' import Hint from './Hint.vue' export default { components: { Headerbar, Listbar, Footerbar, Daggerbar, Hint }, data () { return { height: 'height:'+document.documentElement.clientHeight+'px', showdagger: this.$store.state.cCtrl.showDagger } }, methods: { daggerCtrl: function(){ this.$store.commit('daggerCtrl') } } } </script> <style> .rightpart { position: relative; float: left; width: 83%; } /*2. 添加对应的style,注意前缀为transition的name属性名 !!*/ .daggerbar-enter-active, .daggerbar-leave-active { transition: opacity .5s; } .daggerbar-enter, .daggerbar-leave-active { opacity: 0; } .hinttst-enter-active { transition: all .3s ease; } .hinttst-enter { transform: translateX(-100%); opacity: 0; } /*.listbar-enter-active { transition: all .3s ease; } .listbar-enter { margin-left: -100%; }*/ </style>
transition有四个类名,用于定义enter/leave的过渡效果:
v-enter: 定义进入过渡的开始状态。在元素被插入时生效,在下一个帧移除。
v-enter-active: 定义进入过渡的结束状态。在元素被插入时生效,在 transition/animation 完成以后移除。
v-leave: 定义离开过渡的开始状态。在离开过渡被触发时生效,在下一个帧移除。
v-leave-active: 定义离开过渡的结束状态。在离开过渡被触发时生效,在 transition/animation 完成以后移除。
在项目中使用到的CSS相关暂时是这些,其余坑留着之后踩。
2、关于template
template包含了html的代码,vue和angular同样,也有本身的模版语法,可大体分为如下几类:
赋值 包括{{}} v-html v-bind
等
控制 包括 v-if v-on
等
过滤 vue2.0废弃了自带的fitler,如今只能本身写了
首先声明,如下内容大可能是从vue官网中copy过来的,只是为了作一个总结性的概述,知足喜欢快速阅读的朋友,更详细的内容请移步到官网中。
赋值
所谓赋值,就是把Vue实例中的数据(data声明的部分)渲染到html中。vue相比angular没有脏检查机制,而是用了基于依赖追踪的观察系统。不会像angular那样watcher越多,愈来愈慢。
赋值有一下几种方式:
{{}}
最多见的方式
<span>Message: {{ msg }}</span>
v-once
一次性插值,当数据改变时,插值处的内容不会改变
<span v-once>This will never change: {{ msg }}</span>
v-html
插入html文本的时候用此方式
<div v-html="rawHtml"></div>
v-bind
为属性赋值时使用此方式,能够简写为:
<div v-bind:id="dynamicId"></div> <div :id="dynamicId"></div>
其中css的绑定以下:
<!-- isActive值为true就添加active属性 --> <div v-bind:class="{ active: isActive }"></div>
v-for
用于以数组的形式渲染html
<ul id="example-1"> <li v-for="item in items"> {{ item.message }} </li> </ul>
v-model
双向数据绑定,不一样的类型绑定的方式个有不一样,下面是一个input类型的简单事例,其余类型请看文档:http://cn.vuejs.org/v2/guide/...
<input v-model="message" placeholder="edit me"> <p>Message is: {{ message }}</p>
以上就是赋值操做的简单介绍,更多复杂的操做(特别是v-bind:class和v-for)请阅读官网http://cn.vuejs.org/v2/guide/...
控制
我在这里将条件渲染和事件监听归于控制一类,其实不太好,可是又不知道该怎么分。有点牵强,厚着脸皮往下写
条件渲染v-if
根据条件显示或隐藏组件
<h1 v-if="ok">Yes</h1>
v-else
放在v-if的后面,表示当v-if
为false时,要显示的内容。
<h1 v-if="ok">Yes</h1> <h1 v-else>No</h1>
v-else-if
,顾名思义,用做 v-if
的 else-if
块。能够链式的屡次使用:
<div v-if="type === 'A'"> A </div> <div v-else-if="type === 'B'"> B </div> <div v-else-if="type === 'C'"> C </div> <div v-else> Not A/B/C </div>
v-show
: 和v-if
用法相同,可是v-show
的元素会始终渲染并保存在DOM中,只是改变display值。
<h1 v-show="ok">Hello!</h1>
v-if 有更高的切换消耗而 v-show 有更高的初始渲染消耗。所以,若是须要频繁切换使用 v-show 较好,若是在运行时条件不大可能改变则使用 v-if 较好。
事件监听v-on
: 监听DOM事件触发绑定的methods。
<div id="example-1"> <button v-on:click="counter += 1">增长 1</button> <p>这个按钮被点击了 {{ counter }} 次。</p> </div>
var example1 = new Vue({ el: '#example-1', data: { counter: 0 } })
能够简写为@click="counter += 1"
。vue还提供了事件修饰符和按键修饰符.
事件修饰符好比阻止冒泡:
<a v-on:click.stop="doThis"></a>
按键修饰符指按下键盘上的某个键触发此methods,好比enter键:
<input v-on:keyup.enter="submit">
还能够自定义按键修饰符:
//main.js Vue.config.keyCodes = { v: 86, f1: 112, mediaPlayPause: 179, up: [38, 87] }
过滤
改变数据显示的方式而不改变数据本来的值,不如时间显示格式改成yyyy-MM-dd但本来的date对象不会改变。vue2.0废弃了以前1.0上的全部自带过滤器,如今要本身写了。用法以下:
<!-- in mustaches --> {{ msg| capitalize }} <!-- in v-bind --> <div v-bind:id="rawId | formatId"></div>
<script> export default { name: 'hello', data () { return { msg: 'Welcome to Your Vue.js App!' } }, filters: { capitalize: function (value) { // value对应 | 前面的数据 if (!value) return '' value = value.toString() return value + 'you are lovely' } } } </script>