基于vue的新组件开发
前天完成了一个新组件的开发,做的过程也是各种遇到问题,彻底弄懂了slot,巩固了一些flex布局和jquery的知识,比起自己第一次做组件开发,现在已经是能够下手做,遇到问题解决问题,还算有进步。
但是昨天写博客的时候,就在我快写完的时候,chrome崩溃了。。。我也崩溃了。。。写的东西全没有了!!!我还是继续重新码字吧。。。崩溃。。。
做的这个组件给它起个什么名字比较合理我想了半天也没想出来。。。
需求是这样的:
- 由两部分组成,上面是导航条,下面每一块显示内容。如下图。
- 导航条固定在顶部
- 点击导航里的每一个标签,该标签高亮,该标签相应的div自动跳到内容部分第一栏的位置(这里最后一栏无法跳到第一栏,因为要撑开整个页面)
- 滑动下面的内容,滑到哪个div对应的navs的标签高亮
核心代码写在下面~供参考哦
html插入nav-list模板:
<div id="main">
<nav-list :navs="navs" :contents="contents">
<div v-for="con in contents" :class="'con_' + con.en_name" :slot="'con_' + con.en_name">{{ con.text }}</div> // :class要写在这里,而不要写在<slot>上
</nav-list>
</div>
子组件模板:
这里重点是如何使用slot,并且如何将navs的每一个标签和下面的div对应联系起来!
<template>
<div class="navList">
<div class="nav">
<div v-for="nav in navs" v-bind:class="{ active: cur == nav.en_name }" v-on:click="changeNav(nav.en_name)">{{ nav.name }}</div>
</div>
<div class="list">
<slot v-for="nav in navs" :name="'con_' + nav.en_name"></slot>
</div>
</div>
</template>
子模板的操作代码:
return{
props: {
navs: {
type: Array
, default: function(){
return {}
}
}
, contents: {
type: Array
, default: function(){
return {}
}
} }
, data: function(){
return {
cur: this.navs[0].en_name // 可以在data中这样定义初始值, 这里是将cur的初始值设定为navs的第一个en_name值
}
}
, methods: {
changeNav: function(index){ // 点击任意标签,调用该事件,改变其相应div的位置,即使整个页面向上滑动一定的距离。
this.cur = index
var pos = $(".con_" + index).position().top
var pos2 = $('.navList').position().top // 这个是整个组件距离页面顶端的距离。
$(window).scrollTop(pos+pos2)
}
, scroll: function(){ // scroll()这个事件是div滑动停止时触发的,事件内部定义了:如何确定是哪个div在第一个显示位置,从而找到相应的navs的标签
var _this = this
$(window).on('scrollStop', function(event) {
for( attr in _this.navs ){ var curPos = $(".con_" + _this.navs[attr].en_name).offset().top
var curPos2 = curPos + $(".con_" + _this.navs[attr].en_name).height()
if( curPos <= $(window).scrollTop() + $(".nav").height() && $(window).scrollTop() + $(".nav").height() <= curPos2){
_this.cur = _this.navs[attr].en_name
}else if($(window).scrollTop() < $('.navList').offset().top){
_this.cur = _this.navs[0].en_name
}
} })
}
}
, mounted: function(){
this.scroll() this.$nextTick(function(){
$('.nav').sticky({ // 这个也是直接写好的置于顶部的组件,我也是直接将它用在nav上
infinity: true
})
})
}
}
以上是所有vue组件代码,下面创建一个父实例的js文件:
var sticky = require('core/m/sticky_vue') var vm = new Vue({
el: "#main"
,components: {
navList: require('navList.vue')
}
, data: function(){
return {
navs: [{ name: '美妆', en_name: 'makeup' }
, { name: '时尚', en_name: 'fashion' }
, { name: '鞋履', en_name: 'shoes' }
, { name: '大牌', en_name: 'board'}
, { name: '潮服', en_name: 'clothes'}
]
, contents: [
{ en_name: 'makeup', text: '美妆美妆'}
, { en_name: 'fashion', text: '时尚在哪里时尚在哪里'}
, { en_name: 'shoes', text: '鞋鞋鞋子'}
, { en_name: 'board', text: '大牌驾到'}
, { en_name: 'clothes', text: '服饰!!!'}
]
}
} })
以上就是所有的代码了~在整个过程中遇到的问题都是基础知识不扎实,还有vue的使用不很流畅。大致有以下几点:
- jQuery的offset().top和position().top区分使用,offsetTop得到的是undefined,$(window).scrollTop()可以获取页面的整个垂直的滚动高度,$(window).scrollTop(值)则是设置滚动高度。在做的过程中,对于div要滚动多少、要获取的是div距页面的高还是句定位父级的高、页面要滚动多少、是否要包含nav的高度等等都是需要考虑的问题,所以这一部分自己还是理解的不到位,所以滚动的高度具体的调节都是通过实验的方式得到的。
- scroll()事件何时触发是我一开始不太明白的,比如changeNav(){}我定义在methods中,然后使用v-on:click="changeNav()"调用即可,那么scroll()这类事件应该放在哪里触发呢?在vue中我们将这些事件定义在methods中,然后在mounted或是created中调用即可!
基于vue的新组件开发的更多相关文章
- 基于Vue的WebApp项目开发(二)
利用webpack解析和打包.vue组件页面 相关知识: vue项目中的每个页面其实都是一个.vue的文件,这种文件,Vue称之为组件页面,必须借助于webpack的vue-loader才能运行,所以 ...
- 基于vue项目的组件中导入mui框架初始化滑动等效果时需移除严格模式的问题
基于vue项目的组件中导入mui框架初始化滑动等效果时,控制台报错:Uncaught TypeError: 'caller', 'callee', and 'arguments' properties ...
- vue拖拽组件开发
vue拖拽组件开发 创建临时vue项目 先查看node和npm版本,怎么安装就不多多bb了 再安装vue-cli npm install vue-cli -g //全局安装 vue-cli 检测是否安 ...
- 基于Vue的npm组件库
前言(*❦ω❦) 思维导图可能有点高糊,有点太大了,项目和导图文件放到github或giteee上,这个思维导图也是我文章的架构,思维导图是用FeHelper插件生成的,这个是一款开源chrome插件 ...
- 【技术博客】基于vue的前端快速开发(工具篇)
一.Vue教程 vue.js是一套构建用户界面的渐进式框架.vue采用自底向上增量开发的设计.vue的核心库只关心视图层,非常容易学习,非常容易与其它库和已有项目整合.vue完全有能力驱动采用单文件组 ...
- 基于Vue封装分页组件
使用Vue做双向绑定的时候,可能经常会用到分页功能 接下来我们来封装一个分页组件 先定义样式文件 pagination.css ul, li { margin: 0px; padding: 0px;} ...
- 基于Vue的WebApp项目开发(四)
实现新闻咨询页面 目录结构 步骤一:创建newslist.vue文件 <template> <div id="tml"> <!--使用mui框架,实现 ...
- tornado 基于MongoDB存储 session组件开发
1.开发伊始 根据源码中RequestHandler类中发现__init__函数中会调用自身initialize函数,此函数中为pass,即可以围绕initialize开发一系列的组件 2.开发实现 ...
- 基于Vue的WebApp项目开发(六)
实现商品购买列表页面 步骤一:新建goodslist.vue文件 <template> <div id="tml"> <!--利用mui中的图文表格组 ...
随机推荐
- Mac +WebStorm+nodeJs+Freemarker.js的安装与使用
第一步用webStorm新建node+express项目 第二步执行npm i –save freemarker.js,安装 freemarker.js 模块 第三步安装java jdk包 jdk包地 ...
- JQuery的ajaxFileUpload图片上传初试
本案例主要说讲使用ajaxFileUpload实现图片的异步上传. 1.html代码部分 这里的代码,主要设置一下name,后台获取时候要用到,还有设置一个onchange的事件对应的方法:ajaxF ...
- ios新特性(泛型)
协变 子类转父类 逆变父类给子类赋值
- UIImage
//设置UIImage的圆角 + (UIImage *)imageNamed:(NSString *)name size:(CGSize)size cornerRadius:(CGFloat)corn ...
- iOS 开发之控件快速学习(一)
最近一个朋友想转iOS所以我开始写一些初级iOS学习博客!也希望第一些初学的朋友有所帮助,!好吧进入今天的正题,我们今天主要完成如下界面的显示! 好的一起打开Xcode一下几步我截图说明:
- JS常用正则表达式和JS控制输入框输入限制(数字、汉字、字符)
验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位的数字:^\d{m,n}$验证零和非零开头的数字:^(0|[1-9][0-9]*)$验证有两位小数 ...
- jbpm的学习 出处http://blog.csdn.net/hxirui/article/details/1221911
jbpm入门例子 分类: opensourse2006-09-14 11:30 37308人阅读 评论(22) 收藏 举报 jbpmhibernate数据库oraclemysqltransition ...
- C盘更改文件夹权限
现象:点“安全”添加用户并允许所有权限后,点击“应用”,弹出“无法保存对xxxxx权限所在的更改.拒绝访问”对话框 解决方法:点击“安全”-->"高级"-->“所有者” ...
- Java AOP nested exception is java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice || Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#0' 两个异常解决办法
贴出applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...
- Linux 动态链接库
如何使用动态链接库 Linux下打开使用动态链接库需要三步(实际上和windows下基本一样):1.加载动态链接库,通过调用库函数dlopen()获得链接库的句柄,对应于windows下的 AfxLo ...