vue学习总结笔记

vue学习总结

  • 1.关于项目的布局
  • 2.关于定位
  • 3.向空数组传入值问题问题
  • 4.div的传值
  • 5.事件子传父
  • 6.事件总线
  • 7.组件的点击事件
  • 8.导航浮动顶层
  • 9.解决导航浮动顶层
  • 10.路由操作
  • 11.点击切换问题
  • 12.路由发生变化修改页面title
  • 13better-scroll
    • 1.基本使用
    • 2.动态监听滑动位置动态决定组件是否显示和隐藏
    • 3.解决多次调用refresh
    • 4.下拉更多
  • 14.axios数据传递
  • 15.打包项目问题

1.关于项目的布局

src:这里是开发时的写代码目录
-assets:存储基本css和要用到的img
-common:
-components:公共组件
   -common:可以在其他项目使用的
   -content:不可以在其他项目使用的业务组件
-network:网络请求
   -request.js配置网络请求
   -要用到项目的js文件配置地址和方法
   npm install axios --save
-router:配置路由
   -index.js
   npm install router --save
-store:配置管理状态
   npm install vuex --save
-view:视图组件
   -放组件模块
-App.vue根组件
   -路由视图组件
   -导航
-main.js:主要调用App.vue,路由,状态各个功能组件
   new Vue({
     render: h => h(App),
     router
   }).$mount('#app')
   

2.关于定位

对于父组件:
position: relative;
对于子组件:
position: absolute;
top: 44px;
bottom: 49px;
left: 0;
right: 0;

3.向空数组传入值问题问题

newnums=[]
num1=[10,20,30]
newnums.push(...num1)

4.div的传值

通过ref在组件或者div上定义如ref="dome"
可以通过this.$refs.dome获取组件和div

5.事件子传父

子组件通过$emit('传出的事件名',传入的值)
父组件中通过@事件名="父组件的事件"

6.事件总线

监听不是父子关系的组件
在src下的main.js中添加原型$bus:
Vue.prototype.$bus=new Vue()
通过这个bus可以让home组件监听goodsitem组件的事件

在goodsitem中定义一个事件
在事件发送一个监听事件名
imgLoad(){
        this.$bus.$emit('itemImageLoad')
      }
这时在home组件就可以调用传过来的事件来监听那个组件了
通过回调函数,通过$refs来操作goodsitem组件的方法
this.$bus.$on('itemImageLoad',()=>{
        // console.log('调用了');
        this.$refs.scroll.imgRefresh()
      })

7.组件的点击事件

<组件 @click.native="btnClick">
可以通过methods编写方法

8.导航浮动顶层

position: sticky;
top: 44px;
top是滑动到哪个地方浮动

9.解决导航浮动顶层

1.先要获得这个组件的offsetTop属性
思路,监听图片是否加载完成,设置一个@Load="方法名"进行监听
设置一个属性记录在data中tabOffsetTop
通过子传父,把事件传入home中可以通过this.$refs.tabControl2.$el.offsetTop
获取当前的offsetTop
$el获取当前组件的div属性从而获取offsetTop
这会调用多次
那么需要设置一个数记录当前的状态为flase
当调用一次就设置为true,这样就调用一次了
2.得到offset属性后,可以通过动态监听scroll的方法中写入判断条件
先在data中定义一个状态属性当y的值>第一步求得的offsetTop时设置为true
<的话为false
3.copy一份导航代码,在购物街下面,设置相对定位和z-index使其固定在特定的位置
设置它的v-show为通过第二步设置的状态属性,这里就可以实现下拉浮动的功能了
4不过有一个问题,就是两个组件的index不统一
解决:通过使两个组件设置不同的refs值,在事件获取到一个组件的offsetTop,
在点击事件中,获取这两个组件设置他们的conIndex属性为当前点击的index

10.路由操作

/**
在路由后面添加路径path?iid=id值
可以通过这个实现点击携带商品的id
**/
this.$router.push({
          path:'/detail',
          query: {
            iid: this.goodsItem.iid
          }
        })

11.点击切换问题

通过v-for遍历数据带着index
设置组件一个数据记录状态conindex
根据idnex动态设置样式
如:
:class="{action:index===conindex"

12.路由发生变化修改页面title

在src下的main.js
最后添加以下代码
//初始化主页
 document.title = "首页"
router.beforeEach((to, from, next) => {
  /* 路由发生变化修改页面title */
  if (to.meta.title) {
    document.title = to.meta.title
  }
  next()
})

13better-scroll

1.基本使用

content的div下面只能是一个元素
js调用
new BScroll(document.querySelector('.content'))

2.动态监听滑动位置动态决定组件是否显示和隐藏

//滚动组件
//这里作用限制组件使用
probeType:{
        type:Number,
        default:0
 }
在BScroll中写入 probeType:this.probeType
this.scroll.on('scroll',(position)=>{
        //发送
        this.$emit('scroll',position)
 })

//作用组件
//设置这个组件可以使用
:probe-type=3
@scroll="scroll"

v-show="isShowTop"设置显示和隐藏
定义isShowTop动态获取要不要显示
scroll(position){
    this.isShowTop= -position.y>1000
}

3.解决多次调用refresh

当图片每加载一次就调用一次refresh,会加大对服务器的压力
可以通过debounce函数来解决
通过传入运行的函数,一个时间
/**
防抖函数
 */
先初始化一个变量timer设置为空,
返回一个函数(...args)可以多个参数
如果timer不为空,则清除时间函数
然后执行时间函数并赋值给timer
这样还没有到达时间,时间函数还没有执行,就会被清空
直到时间结束或者是全部加载完后

4.下拉更多

滑动组件
定义一个属性来决定哪个组件可以使用
pullUpLoad:{
        type:Boolean,
        default: false
      }
this.scroll.on('pullingUp',()=>{
        //上拉加载更多
        this.$emit('pullUp')
 })
父组件
//定义这个组件管用
:pullUpLoad="true"
@pullUp="pullUp
定义一个方法
pullUp(){
    this.getHomeGoods('父组件存储的状态值')


注意:下拉刷新后要调用this.scroll.finishPullUp()

}

14.axios数据传递

1.先创立network文件夹,主要来设置网络请求
2.建立request.js,配置axios
安装
install axios --save
导入axios
import axios from 'axios'
以函数的形式导出
export function request(config) {
步骤1,2,3
}
//1.创建axios的实例
  const instance=axios.create({
      baseURL:'http://123.207.32.32:8000',
      timeout:10000
    })
//2.设置拦截器
  instance.interceptors.request.use(config=>{
    return config
  },error => {
    //console.log('request拦截失败请求');
    return error
  })

  instance.interceptors.response.use(response=>{
    //console.log('response拦截成功响应');
    return response.data
  },error => {
    //console.log('response拦截失败响应');
    return error
  })
//3.发送真正的请求
  return instance(config)


以上是对于axios的封装
如果组件要使用时,直接调用方法就行
导入方法
import{request} from "./request";
导出对于这个组件的方法数据
export function getHomeMultidata() {
  return request({
    url:'/api/v1/home/multidata?type=pop'
  })
}
在要用的主组件导入用到的方法
import {getHomeMultidata,getHomeGoods} from 'network/home'

在data定义默认数据,便于通过请求过来的数据进行赋值
在methods时定义方法,
getHomeMultidata(){
        getHomeMultidata().then(res=>{;
          this.banners=res.data.banner.list;
          this.recommends=res.data.recommend.list
        })
      },
然后在组件创建前调用这个方法请求
created() {
      //1.请求多个数据
      this.getHomeMultidata();
}

15.打包项目问题

1.在dist中建立server.js文件
添加代码:
var express = require('express');
var app = express();
const hostname = 'localhost';
const port = 8080;
app.use(express.static('./'));
app.listen(port, hostname, () => {
  // console.log('hello');
  console.log('http://'+hostname+':'+port);
});
2.cd到dist目录
运行代码 npm install express
直接运行 node server

你可能感兴趣的:(vue,vue学习)