怎么使用vuejs做一个类似vue cell swipee效果

在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
标签:至少1个,最多5个
原文链接:
本文基于vue1.x
基于vue2.x&webpack2.x请移步至
最近一段时间忙着工作的一些事情,同时自己也在试着把项目中的一些移动端页面试着用vuejs重写,所以没时间写文章,今天终于有空可以写一下,由于页面并没有写完,所以就将自己这几天做页面的时候遇到的一些问题总结了一下。其实很多在官网都能找到,但是我们只看官网教程不去写,很难理解到底是什么意思,这里我把我用到的列出来。
文章中提到的很多东西都在我的demo中用到,我的demo地址:
1.Vuejs组件
vuejs构建组件使用
ponent('componentName',{ /*component*/ });
这里注意一点,组件要先注册再使用,也就是说:
ponent('mine',{
template:'#mineTpl',
props:['name','title','city','content']
var v=new Vue({
el:'#vueInstance',
name:'zhang',
title:'this is title',
city:'Beijing',
content:'these are some desc about Blog'
如果反过来会报错,因为反过来代表先使用了组件的,但是组件却没注册。
webpack报错后,使用webpack --display-error-details可以排错
2.指令keep-alive
在看demo的时候看到在vue-router写着keep-alive,keep-alive的含义:如果把切换出去的组件保留在内存中,可以保留它的状态或避免重新渲染。为此可以添加一个keep-alive指令
&component :is='curremtView' keep-alive&&/component&
3.如何让css只在当前组件中起作用
在每一个vue组件中都可以定义各自的css,js,如果希望组件内写的css只对当前组件起作用,只需要在style中写入scoped,即:
&style scoped&&/style&
4.vuejs循环插入图片
在写循环的时候,写入如下代码:
&div class="bio-slide" v-for="item in items"&
&img src="{{item.image}}"&
此时在控制台会出现警告[Vue Warn]: src="{{item.image}}": interpolation in "src" attribute will cause a 404 request. Use v-bind:src instead.这里意思是在“src”属性插值将导致404请求。使用v-bind:src代替。所以替换成如下:
&div class="bio-slide" v-for="item in items"&
&img v-bind:src="item.image"&
这里需要主要,v-bind在写的时候不能再用{{}},根据官方的说法:
&a v-bind:href="url"&&/a&
这里 href 是参数,它告诉 v-bind 指令将元素的 href 特性跟表达式 url 的值绑定。可能你已注意到可以用特性插值 href="{{url}}" 获得同样的结果:这样没错,并且实际上在内部特性插值会转为 v-bind 绑定。
5.绑定value到Vue实例的一个动态属性上
对于单选按钮,勾选框及选择框选项,v-model绑定的value通常是静态字符串(对于勾选框是逻辑值):
&!-- `toggle` 为 true 或 false --&
&input type="checkbox" v-model="toggle"&
但是有时候想绑定value到vue实例的一个动态属性上,这时可以用v-bind实现,并且这个属性的值可以不是字符串。例如绑定Checkbox的value到vue实例的一个动态属性:
type="checkbox"
v-model="toggle"
v-bind:true-value="a"
v-bind:false-value="b"&
&p&{{toggle}}&/p&
这里绑定后,并不是说就可以点击后由true,false的切换变为a,b的切换,因为这里定义的动态a,b是scope上的a,b,并不能直接显示出来,此时
//当选中时
vm.toggle === vm.a
//当没选中时
vm.toggle === vm.b
所以此时需要在data中定义a,b,即:
6.片段实例
下面几种情况会让实例变成一个片断实例:
模板包含多个顶级元素。
模板只包含普通文本。
模板只包含其它组件(其它组件可能是一个片段实例)。
模板只包含一个元素指令,如&partial& 或 vue-router 的 &router-view&。
模板根节点有一个流程控制指令,如 v-if 或 v-for。
这些情况让实例有未知数量的顶级元素,它将把它的 DOM 内容当作片断。片断实例仍然会正确地渲染内容。不过,它没有一个根节点,它的$el 指向一个锚节点,即一个空的文本节点(在开发模式下是一个注释节点)。但是更重要的是,组件元素上的非流程控制指令,非 prop 特性和过渡将被忽略,因为没有根元素供绑定:
&!-- 不可以,因为没有根元素 --&
&example v-show="ok" transition="fade"&&/example&
&!-- props 可以 --&
&example :prop="someData"&&/example&
&!-- 流程控制可以,但是不能有过渡 --&
&example v-if="ok"&&/example&
片段实例也有用处,但是通常情况下组件有一个根节点比较好,它会保证组件元素上的指令和特性能正确的转换,同时性能也稍微好些。
7.路由嵌套
路由嵌套会将其他组件渲染到该组件内,而不是进行整个页面跳转router-view本身就是将组件渲染到该位置,想要进行页面跳转,就要将页面渲染到根组件,在起始配置路由时候写到:
var App = Vue.extend({ root });
router.start(App,'#app');
这里首先将根组件注册进来,用于将路由中配置好的各个页面渲染出来,然后将根组件挂载到与#app匹配的元素上。
8.实现多个根据不同条件显示不同文字的方法
v-if,v-else可以实现条件选择,但是如果是多个连续的条件选择,则需要用到计算属性computed。例如实现当输入框中什么都没写的时候显示字符串‘empty’,否则显示输入框中的内容,代码如下:
&div id="test"&
&input type="text" v-model="inputValue"&
&h1&{{changeVaule}}&/h1&
el:'#test',
changeVaule:'123'
computed :{
changeVaule:function(){
if(this.inputValue!==''){
return this.inputV
return 'empty';
9.Vuejs在变化检测问题
1.检测数组
由于javascript的限制,vuejs不能检测到下面数组的变化:
直接索引设置元素,如vm.item[0]={};
修改数据的长度,如vm.item.length。
为了解决问题1,Vuejs扩展了观察数组,为它添加一个$set()方法:
// 与 `example1.items[0] = ...` 相同,但是能触发视图更新
example1.items.$set(0, { childMsg: 'Changed!'})
问题2,需要一个空数组替换items。
除了$set(),vuejs也为观察数组添加了$remove()方法,用于从目标数组中查找并删除元素,在内部调用了splice()。因此,不必:
var index = this.items.indexOf(item)
if (index !== -1) {
this.items.splice(index, 1)
this.items.$remove(item);
2.检测对象
受ES5的显示,Vuejs不能检测到对象属性的添加或删除。因为Vuejs在初始化时候将属性转化为getter/setter,所以属性必须在data对象才能让Vuejs转换它,才能让它是响应的,例如:
var data = { a: 1 }
var vm = new Vue({
data: data
// `vm.a` 和 `data.a` 现在是响应的
// `vm.b` 不是响应的
data.b = 2
// `data.b` 不是响应的
不过,有办法在实例创建之后添加属性并且让它是响应的。对于Vue实例,可以使用$set(key,value)实例方法:
vm.$set('b', 2)
// `vm.b` 和 `data.b` 现在是响应的
对于普通数据对象,可以使用全局方法Vue.set(object, key, value):
Vue.set(data, 'c', 3)
// `vm.c` 和 `data.c` 现在是响应的
有时你想向已有对象上添加一些属性,例如使用 Object.assign() 或 _.extend() 添加属性。但是,添加到对象上的新属性不会触发更新。这时可以创建一个新的对象,包含原对象的属性和新的属性:
// 不使用 `Object.assign(this.someObject, { a: 1, b: 2 })`
this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })
10.关于vuejs页面闪烁{{message}}
在vuejs指令中有v-cloak,这个指令保持在元素上直到关联实例结束编译。和CSS规则如[v-cloak]{display:none}一起用时,这个指令可以隐藏未编译的Mustache标签直到实例准备完毕。用法如下:
[v-cloak]{
&div v-cloak&{{message}}&/div&
这样&div&不会显示,直到编译结束
11.关于在v-for循环时候v-model的使用
有时候需要循环生成input,用v-model绑定后,利用vuejs操作它,此时我们可以在v-model中写一个数组selected[$index],这样就可以给不同的input绑定不同的v-model,从而分别操作他们。这个我在demo中的dataBind.vue中用到。
12.vuejs中过渡动画
在vuejs中,css定义动画:
.zoom-transition{
width:60%;
transform: translate(-50%,-50%);
-webkit-transition: all .3
transition: all .3
.zoom-enter, .zoom-leave{
transform: translate(0,0);
其中动画在定的时候要注意上下对应,上面有什么,下面有什么,都要变化的,如果有不变化的,应该抽离出去,作为公共css样式,在上面的css中,如果我只写 transform: translate(-50%,-50%);而不写下面的transform: translate(0,0);则会导致上面的transform: translate(-50%,-50%);被添加到下面,认为这个是不变的。
13.指令v-el的使用
有时候我们想就像使用jquery那样去访问一个元素,此时就可以使用v-el指令,去给这个元素注册一个索引,方便通过所属实例的$el访问这个元素。注意HTML不区分大小写,所以v-el:someEl将转换为全小写。可以用v-el:some-el然后设置this.$el.someEl。示例
&span v-el:msg&hello&/span&
&span v-el:other-msg&world&/span&
this.$els.msg.textContent // -& "hello"
this.$els.otherMsg.textContent // -& "world"
this.$els.msg //-&&span&hello&/span&
14.关于vuejs中使用事件名
在vuejs中,我们经常要绑定一些事件,有时候给DOM元素绑定,有时候给组件绑定。绑定事件在HTML中用v-on:click-"event",这时evet的名字不要出现大写,因为在1.x中不区分大小写,所以如果我们在HTML写v-on:click="myEvent"而在js中写myEvent就出错误,所以在vuejs的1.x绑定事件时候,要尽量避免使用大写字母。在2.0中没有该限制!
15.v-if与v-show的区别
v-if直接不渲染这个DOM元素,而v-show是会渲染DOM元素,只是使用display:none隐藏,打开开发者工具可以看到该DOM
16.关于transition全局钩子如何在组件中使用
Vue.transition是定义一个全局transition钩子的,如果想针对组件定义,则需要如下写法:
export default{
transition:{
enter() {},
leave() {}
这样fade这个过度钩子只会作用于组件内,如果同时有同名的全局钩子,则会优先使用组建定义的
17.利用vue-router如何实现组件在渲染出来前执行某个事件
export default{
selected:0,
currentView:'view_0'
choose(index) {
this.selected=
this.currentView='view_'+
/*每次切换路由,在渲染出页面前都会执行*/
15 收藏&&|&&248
你可能感兴趣的文章
9 收藏,2.4k
2 收藏,416
本作品采用 署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
好几处错字和排版混乱……还有把 v-bind 翻译成 v-绑定 的,好醉啊哥们
好几处错字和排版混乱……还有把 `v-bind` 翻译成 `v-绑定` 的,好醉啊哥们
谢谢提醒,这个是我遇到问题后记录的一些笔记,可能写的比较随意吧,我再修改下
谢谢提醒,这个是我遇到问题后记录的一些笔记,可能写的比较随意吧,我再修改下
老司机,带我
老司机,带我
大哥,我得跟你混
大哥,我得跟你混
请问这是哪个版本的Vue,1.x还是2.0?
请问这是哪个版本的Vue,1.x还是2.0?
是1.0的,2.0还没有接触
是1.0的,2.0还没有接触
还是有点不明白路由嵌套 的那个页面跳转是怎么一回事?
还是有点不明白路由嵌套 的那个页面跳转是怎么一回事?
就是在使用vue-router的时候,写了router-view意味着包含这个标签的父元素就是一个屏幕,组件在这个屏幕切换,在写vue的单页面应用的时候,有一个app.vue,里面写了router-view,因为这个app.vue就是完全的整个屏幕,所以整个页面切换,想象一下,如果在这个大屏幕中有一个小屏幕,那么在这个小屏幕也可以实现组件的切换,但是整个大屏幕的组件不会发生切换,就是这样。我是这样理解的,不知道说清楚没,你可以做个demo看看,在一个组件里面利用router-view做一个tab切换。
就是在使用`vue-router`的时候,写了`router-view`意味着包含这个标签的父元素就是一个屏幕,组件在这个屏幕切换,在写vue的单页面应用的时候,有一个app.vue,里面写了`router-view`,因为这个app.vue就是完全的整个屏幕,所以整个页面切换,想象一下,如果在这个大屏幕中有一个小屏幕,那么在这个小屏幕也可以实现组件的切换,但是整个大屏幕的组件不会发生切换,就是这样。
我是这样理解的,不知道说清楚没,你可以做个demo看看,在一个组件里面利用`router-view`做一个tab切换。
如果,我要在多个页面跳转。app.vue下面只需要一个router-view么,然后其他的组件在这个router-view里面加载,实现整个页面的切换么?
如果,我要在多个页面跳转。app.vue下面只需要一个router-view么,然后其他的组件在这个router-view里面加载,实现整个页面的切换么?
是的,只需要一个,然后你在里面写v-link就行,你看看我写的
是的,只需要一个,然后你在里面写`v-link`就行,你看看我写的[demo](/MrZhang123/Vue_project/tree/master/vue_spa_demo)
&img v-bind:src="item.image"& ,循环的时候,图片路径不写成,需要添加路径时,比如:v-bind:src="/public/"+item.image ,这样写不行,请问应该怎样补充图片路径?谢谢。
&img v-bind:src=&item.image&& ,循环的时候,图片路径不写成,需要添加路径时,比如:v-bind:src=&/public/&+item.image ,这样写不行,请问应该怎样补充图片路径?谢谢。
v-bind:src=" '/public' + item.image ",你这属于基本语法没搞明白的问题啊大哥
v-bind:src=& '/public' + item.image &,你这属于基本语法没搞明白的问题啊大哥
@ 谢谢回复,当时没有注意到,后来知道了。
@ 谢谢回复,当时没有注意到,后来知道了。
请问,你对vuex怎么看
请问,你对vuex怎么看
写的挺好的。看起来确实是做项目中遇到的实际问题的总结。
写的挺好的。看起来确实是做项目中遇到的实际问题的总结。
各位前段开发的朋友 想要vue饿了么和vue的高级实战音乐app
资源鸟这里有免费的资源哦
各位前段开发的朋友
想要vue饿了么和vue的高级实战音乐app
资源鸟这里有免费的资源哦
有点儿意思。
有点儿意思。
分享15套最新的vue.us视频教程给大家
分享15套最新的vue.us视频教程给大家 /video/56.html
分享到微博?
我要该,理由是:初学vue2.0做一个很简单的过渡效果 - 简书
初学vue2.0做一个很简单的过渡效果
现在前端主流的js库很多,作为一个初学者,最近学习了vue.js,感觉vue优点好多,也好用很多,平时做一些效果也几乎不用操作DOM,还可以做数据的双向绑定,还可以定义组件,以及有很多好用的指令,在这里就不多介绍了,由于是初学者,这里主要先做一个很简单的过渡效果。先看是什么样的
直接开始写,HTML部分:
&template&
&div class="other-con"&
&div class="bottom"&
&div class="btns" @click="showOther"&点&/div&
&transition name="fade" v-for="(item,index) in balls"&
&div :class="item.message" v-show="ballShow"&{{index+1}}&/div&
&/transition&
&/div&&/template&然后接下来就开始在script中对过渡列表里面的数据定义。
script部分:
export default {
ballShow: false,
{message:"one"},
{message:"two"},
{message:"three"},
{message:"four"},
{message:"five"}
methods: {
showOther () {
this.ballShow = !this.ballS
&/script&可见我在js中并没有操作dom,只是通过指令来监听dom,然后最后就是布局以及过度的实现,css预处理器我用的less。
style部分:
&style lang="less"&
.ballPub(@bg, @top, @lf, @ml, @tm, @del, @delo){
background: @
margin-left: @
&.fade-enter-active, &.fade-leave-active {
transition: opacity @
transition-delay: @
opacity: 1;
&.fade-enter, &.fade-leave-active {
transition-delay: @
opacity: 0
bottom: 0;
width: 100%;
height: 40
height: 30
line-height: 30
border-radius: 50%;
text-align:
background: #FFCE44;
.ballPub(#80B3FF, -15px, 50%, -95px, .2s, .2s, 1s);
.ballPub(#FEE681, -40px, 50%, -60px, .2s, .4s, .8s);
.ballPub(#FF8080, -55px, 50%, -15px, .2s, .6s, .6s);
.ballPub(#FEE681, -40px, 50%, 30px, .2s, .8s, .4s);
.ballPub(#8DD35F, -15px, 50%, 65px, .2s, 1s, .2s);
过渡的css类名.PNG
到这里,这个效果就ok啦,第一次写文章,文笔不太好,可能描述的不太清楚,或者描述的太繁琐,有不足的地方欢迎大家指正,相互交流,谢谢~在扯废话浪费大家的时间之前,先上个代码好了,使用vue实现起来很简单……
&div class="overlayer" @touchmove.prevent &
对,就是这么简单,加上@touchmove.prevent就可以屏蔽滑动页面了,然后再和普通的遮罩层一样,加点样式
/*遮罩层*/
.overlayer{
position:fixed;
width:100%;
height:100%;
z-index:10;
如此,便可以了_(:з)∠)_,vue真是好用啊……
以下是废话和原理
开发移动端页面的时候有一个很比较常见的需求,在出现弹窗时,禁止滑动弹窗后面的主体页面;
实际上大部分弹窗插件(或者组件)都带了这样的功能,所以我自己也从来没研究过这个;
这次的项目突然出现了一个需要自己写弹窗的场景……我瞬间就懵逼了QwQ
虽然毫无思路,但是代码还是要写的,效果还是要实现的,问题还是要解决的,而程序员解决问题的第一步,自然就是先去百度一下;
一般来讲吧,普通问题都可以直接百度解决,百度不到的再考虑问人,屏蔽滑动的遮罩层这样常见的需求,自然是有一大堆的解决方案,不过……太多了根本没法选啊(╯‵□′)╯︵┻━┻
随便试了一套方案,未果,遂放弃了继续尝试的打算……还是去翻别人的源码吧。
首先想到了中的组件;
认真阅读了一下,发现这个遮罩层也没做什么事情,就是屏蔽了一下touchmove事件,拿到这个思路再回去自己查了下资料,移动端的屏幕滑动,实际上就是touchmove事件的默认行为,在冒泡过程中任何一层阻止这个默认行为,都可以阻止屏幕滑动,弄懂原理,实现起来就简单了,传统做法是在body上添加一个touchmove事件处理器,在显示遮罩层的时候使用.preventDefault()方法阻止默认行为,而vue就更简单了,把弹窗之类的都写在遮罩层元素内部,然后直接在遮罩层上加上一个取消默认行为的事件处理器,就可以咯~
如果弹窗不在遮罩层内部,那么冒泡就不会经过遮罩层,也就无法屏蔽滑动了0.0
&div class="overlayer" @touchmove.prevent &
&div class="popup"&
如果在这个div中滑动,触发的事件是不会经过overlayer的,也就无法屏蔽滑动了
如果实在不能把弹窗放到遮罩层内,那么给弹窗加一个单独的 .prevent 修饰符也可以,下面这两种方式都是有效的:
&!--plan A--&
&div class="overlayer" @touchmove.prevent &
&div class="popup"&
如果在这个div中滑动,触发的事件会经过overlayer,可以屏蔽滑动
&!--plan B--&
&div class="overlayer" @touchmove.prevent &
&div class="popup"
@touchmove.prevent&
如果在这个div中滑动,触发的事件也会被禁用默认行为, 也可以屏蔽滑动
这种屏蔽方式只是屏蔽了滑动,对于PC端的鼠标滚轮是无效的,但屏蔽鼠标滚轮也很简单,把 touchmove 事件处理器改成 scroll 事件的处理器就好了~就像这样:
&div class="overlayer" @scroll.prevent &
阅读(...) 评论()}

我要回帖

更多关于 vue photoswipe 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信