vue项目总结

Vue总结

 

安装

安装node.js LTS版本 http://nodejs.org

Window .msi mac.npk

Node -v //输出版本号 安装成功

Npm -v //node 包管理工具

码云 网上云仓库

Private 创建私有仓库

开源:MIT license

 

码云git关联:

线上本地关联:

  1. 本地安装git //http://git-scm.com

  2. Git --version //输出git版本号安装成功

 

安装git

配置git:

打开git bash Here

初始化用户名 git config --global user.name ‘******’

初始化邮箱: git config --global user.email ‘******’

配置公钥

Git clone ‘SSH地址’

git status(把文件添加到线上仓库)git

git add . (增加到本地缓冲区)

git commit -m 'product initialized'

git push

安装:npm install

新建分支:

Git pull

Git checkout home-index

Git status //查看在哪个分支上

Git add .

Git commit -m “change”

Git push

Git checkout master

Git merge origin/index-swiper //合并到master

Git push

 

安装vue-cli:

1、npm install --global vue-cli

2、vue init webpack Travel

Y

3、y,y,y,n,n

4、cd travel

5、npm run dev

 

引入fastclick

npm install fastclick --save

(import fastClick from 'fastclick')

fastClick.attach(document.body) //fastclick 解决移动端延迟300ms点击事件

 

Axios父组件向子组件传递数据:

父组件:

<hot-city :city = “cities” :hot = “hotCities”></hot-city>

Data () {

Return {

Cities: {},

hotCities: []

}

}

Methods: {

getCityInfo () {

Axios.get(‘/api/city.json’)

.then(this.handleGetCityInfoSucc)

},

handleGetCityInfoSucc (res){

Res = res.data

If (res.ret && res.data) {

Const data = res.data

This.cities = data.cities //json中的名字

This.hotCities = data.hotCities

}

}

}

Mounted () {

This.getCityInfo();

}

子组件接收:

Props:{

City: Object,

Hot: Array

}

V-for = “item of hot”

 

Axios的用法 vue-ajax:

Ajax 第三方模块 axios

Npm install axios --save

ajax请求放在父组件发送

Import axios from ‘axios’

Methods: {

getHomeInfo () {

Axios.get(“ url”).then(this.getHomeInfoSucc)

},

getHomeInfoSucc () {

Res = res.data

If (res.ret && res.data) {

Const data = res.data

This.cities = data.cities //json中的名字

This.hotCities = data.hotCities

}

}

Mounted () {

THIS.getHomeInfo() //渲染挂在 声明周期函数

}

 

2.遇到的问题:

 

2.1使用vue-awesome-swiper 轮播图图片加载不到:

本地图片应放在static目录下,

安装时应加上@2.6.7版本号,否则不显示轮播点

data() {

return {

swiperOption: {

pagination: '.swiper-pagination',

Loop: true //可以循环滑动

},

}

2.2 公用图片画廊轮播

点击显示 图片滑动不流畅:

Swiper3 :

swiperOptions: {

//添加

observeParents: true,

Observer: true //自我刷新

PaginationType: ‘fraction’ //显示滚动页数

}

$emit()用法;

Npm run build //打包编译 多出dist目录是要上线的内容 放在后端根目录中

 

2.2父组件的值传给子组件:

父组件:

<template> <div> <input v-model="message"> <!--使用v-model进行双向绑定--> <my-button4 :myMessage="message"></my-button4> <!--然后使用v-bind进行数据绑定,将父组件的message传给子组件,用myMessage接收--> </div></template><script> import myButton4 from './components/myButton4.vue' /*导入子组件*/ export default{

data(){ /*这一步非常重要,记得要先返回数据给message,然后再用components*/ return{

// message:"Message from parent" }

}, components:{ /* 一定要记得先返回数据,如果和data()这一步反了,会出错的,*/ myButton4 /*因为父组件要先有了数据,才可以将数据返回给子组件*/ }

}</script>

子组件:

<template> <div> <span>myMessage:{{myMessage}}</span> <!--打印出父组件给的数据,即父组件的message,父组件的message发送变化,这里随之改变--> </div></template><script> export default{

props:{ /*声明props*/ myMessage:String /*定义传值的类型,也可以简写成props['myMessage'] */ }

}</script>

 

编码中遇到问题总结:

  1. 列表 - 详情 动态路由

<router-link :to= “’/detail/’ + item.id” tag=”标签名”> </router-link>

路径:

Path: ‘/detail/:id’

  1. 每次返回首页页面数据都会重新加载 冗余

 

3、动画显示隐藏

页面展示时执行activated

Activated () {

Window.addEventListener(‘scroll’, this.handleScroll)

},

Methods: {

handleScroll () {

Const top = document.documentgetElement.scrollTop;

If( top >60) {

This.showAbs = false;

Const opacity = top/140

Opacity = opacity>1 ?1:opacity;

This.opacityStyle = {

opacity

}

}else{

This.showAbs = false

}

}

}

 

4、fadeAnimation:

<template>

<transition>

<slot></slot>

</transition>

</template>

<script>

export default {

name: "FadeAnimation"

}

</script>

<style lang="stylus" scoped>

.v-enter,.v-leave-to

opacity:0

.v-enter-active,.v-leave-active

transition : opacity .5s

</style>

  1. Localstorages数据存储

相当于cookie

State: {

City:defauleCity //localStorage.city || ‘上海’

},

Mutations: {

changeCity (state, city){

State.city = city

// localStorage.city = city

Try{

localStorage.city = city

} catch (e){}

}

}

尽量包含一个try catch 防止浏览器抛出异常

Let defaultCity = ‘上海’

Try {

If( localStorage.city) {

defaultCity = localStorage.city

}

} catch(e) {}

Import { mapState } from vuex

Computed: {

...mapState([‘city’])

...maoState({

currentCity: ‘city’

})

}

  1. 返回上一页数据被重新加载问题

Keep-alive 优化网页性能

APP.vue

<keep-alive>

<router-view/>

</keep-alive>

使用keep-alive 会多出一个activated() 状态

每次页面被加载时执行

Data () {

Return {

lastCity: ‘ ’

}

},

Mounted () {

This.lastCity = this.city //保存上一个城市

},

Activated () {

If(this.lastCity !=== this.city){

This.lastCity = this.city

This.getHomeInfo()

}

}

  1. 钩子函数顺序

在页面首次加载执行顺序有如下:

beforeCreate                //在实例初始化之后、创建之前执行 created                         //实例创建后执行 beforeMounted             //在挂载开始之前调用 filters      //挂载前加载过滤器 computed                     //计算属性 directives-bind              //只调用一次,在指令第一次绑定到元素时调用 directives-inserted        //被绑定元素插入父节点时调用 activated                       //keek-alive组件被激活时调用,则在keep-alive包裹的嵌套的子组件中触发 mounted     //挂载完成后调用

{{}}                                //mustache表达式渲染页面

修改页面input时,被自动调用的选项顺序如下: watch                           //首先先监听到了改变事件 filters     //过滤器没有添加在该input元素上,但是也被调用了 beforeUpdate              //数据更新时调用,发生在虚拟dom打补丁前 directived-update        //指令所在的组件的vNode更新时调用,但可能发生在其子vNode更新前 directives-componentUpdated//指令所在的组件的vNode及其子组件的vNode全部更新后调用 updated                      //组件dom已经更新

组件销毁时,执行顺序如下 beforeDestroy            //实例销毁之前调用 directives-unbind       //指令与元素解绑时调用,只调用一次 deactivated                //keep-alive组件停用时调用 destroyed                  //实例销毁之后调用

  1. 前后端联调跨域问题

Config——index.js

module.exports = {

dev: {

// Paths

assetsSubDirectory: 'static',

assetsPublicPath: '/',

proxyTable: {

'/api': {

target: "http://localhost/bci",

changeOrigin:true, //允许跨域

pathRewrite: {

'^/api': ''

}

}

},

axios在vue中引用:

methods: {

getSwiperInfo () {

axios.get('/api/mainclassify/getRecommendProduct?userId=88bdd4cc311f48afb327ae9e2b0bc9e8&id=0&wh=1080*1794&timestamp=1534217980886&imei=861533037115654&version=1.5.0.10&sign=D4778A54F2F49A1AC3FEDC410E9692F7')

.then(this.getSwiperInfoSucc)

},

getSwiperInfoSucc (res) {

res = res.data

if (res.errCode && res.result) {

const data = res.result

this.banners = data.gdlist

this.list = data.list

}

console.log(res.result.gdlist)

}

},

mounted () {

this.getSwiperInfo()

}

}

 

9、非父子间传值

 

1、vuex数据共享

 

2、bus/总线机制

兄弟之间传值,同一个父元素

Vue.propoty.bus = new Vue();

Methods: {

handleClick(){

This.bus.$emit(‘change’, 所传值)

}

}

//接受

Mounted(){

This.bus.$on(‘change’, function(msg){

msg

})

}

 

10、父子间动态传值

父组件通过props向子组件传值;

A页面:

<div>

<A-child :alist = “list”></A-child>

</div>

Props:{

List: Array

}

  1. child页面:

Props:{

Alist: Array

}

子组件通过触发事件向父组件传值;

  1. router传参

方法一:

  1. 在路由项目中添加:

{

Path: ‘/detail/:id’,

Name: ‘Detail’,

Component: Detail

}

A页面:

<router-link :to=” ‘/detail’ + id ”></router-link>

使用:this.$router.params.id

方法二:

{

Path: ‘/detail/:id’,

Name: ‘Detail’,

Component: Detail

}

A页面:

<router-link :to=” {path:’/detail’, query:{name: id}} ”></router-link>

使用:this.$router.query.id

  1. :class三元表达式

:class=” ifshow ? ‘aa’ : ‘bb’ ”

Data () {

Return{

Ifshow: true

}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值