vue 懒人_vue项目中常用的

v-show控制页面的切换,隐藏显示

在要加事件的地方,加@click.stop.prevent="card"

在要隐藏显示组件的地方,加v-show="showCard"

如图;

5b5424a96636daf35eb2199b4b2bd156.png

031e2ea86f3fae4711449f4598461ba3.png

export default{

name:'center',

data () {return{//折叠

fold: false,

showCard:false}

},

methods: {

card () {this.showCard = !this.showCard //这个很重要,如果写成this.showCard = true,只能点击一次

} } }

通过操作对象的变量或者模型(data里面的数据可以称为模型),改变dom,而不是直接操作dom,间接达到vue和js的分离。

1.价格的增减功能,通过点击,数量实现改变

用到v-model双向绑定,

//part指的是循环遍历里面的part,part in res

-

+

//加减数量,通过传入的参数判断数量的加减,

changeMoney:function(product,way){if(way>0){

product.productNumber++;

}else{

product.productNumber--;if(product.productNumber<1){ //如果减到小于1的时候,让商品至少为1,才能购买

product.productNumber=1}

}

}

2.购物车的单选按钮,选中商品功能,接口里面没有字段,是监听不到的,通过$set设置一个不存在的变量,放在data里面,

两种方法,1.全局注册 Vue.set(item,"checked",true);2.局部注册 this.$set(part,"checked",true);

如果一个变量不在data里面声明或者不在对象里面,用vue监控不到属性(一个对象里面的变量不存在,解决办法)

思路:先判断商品是否选中,然后取反

注意:绑定class,一定是数组或者对象,{‘key’:},

//调用下面的方法,part.checked=true,即为checked:true

//选中商品的方法

selectProduct:function(part){//part是遍历里的数组if(typeof part.checked=='undefined'){//1.通过typeof判断变量是否存在,json;里面没有字段checked是否选中,所以需要判断//Vue.set(item,"checked",true)//第一种全局注册,全局的set就是在data里面创建,用set创建checked属性放到part变量里面,值为true,此时,part.checked=true

this.$set(part,"checked",true);//局部注册,带有$符号的为局部变量,不带$全局,例如过滤器,$.set可以在遍历part里面创建

}else{

part.checked=!part.checked; //取反

}

}

3.全选功能

思路:绑定class,通过判断class

都不存在的属性,如果是在item遍历的时候需要加,用$set加,如果是页面加属性,加在data里面,调用data的全局变量

@click里面可以放表达式,可以放一元表达式和三元表达式,例如:checkAllFlag==true?true:false,调用函数,不能放业务逻辑,不能写,例如var checkAllFlag=true

全选

取消全选

data :function() {return{

produceList:[],

pro:'',

tit:'this id ',

checkAllFlag:false//一定要定义这个变量,否则不会监听

}

}

//全选

checkAll:function(flag){//flag判断是全选还是取消取消

this.checkAllFlag=flag;var _this=this;//作用域发生变化,

//控制当前全选按钮是否选中取消选中把当前选中的取反//if(this.checkAllFlag){//如果选中的话,遍历商品列表

this.produceList.forEach(function(part,index){if(typeof part.checked=='undefined'){//判断变量是否存在,json;里面没有字段checked是否选中,所以需要判断

_this.$set(part,"checked",_this.checkAllFlag);//局部注册,带有$符号的为局部变量,不带$全局,例如过滤器

}else{

part.checked=_this.checkAllFlag; //取反

}

})//}

}

click事件,报错[Vue warn]: Invalid handler for event "click": got undefined,傻逼百度了好久,后来发现是methods写错了,记住是methods不是method

e874d3a375ad90b64bc01600a8c478b8.png

设置一个不存在的字段,先引用vue,在使用vue.set方法

Vue.set(this.food, 'count', 1);

38e441139d5bc00453ccf8b494530240.png

通过条件判断加不同的class

{{payDesc}}

payClass() {

if (this.totalPrice < this.minPrice) {

return 'not-enough';

} else {

return 'enough';

}

}

饿了么不能用vm.$dispatch,可以使用vue2.0的eventBus实现兄弟组件通信,解决这个问题,这个网址讲解的还是挺仔细的http://blog.csdn.net/u013034014/article/details/54574989?locationNum=2&fps=1

1.新建一个EventBus.js,js内容为以下,在goods.vue和cartcontrol.vue中,分别引用

import Vue from 'vue';

export default new Vue();

2.cartcontrol.vue

methods: {

addCart(event) {//防止多次被点击

if (!event._constructed) {return;

}if (!this.food.count) {//添加food不存在的字段时 需要调用vue.set方法添加,这样才可以通过vue观测到这个字段的变化

Vue.set(this.food, 'count', 1);

}else{this.food.count++;

}

Bus.$emit('cart.add', event.target);

},

}

3.goods.vue

created() {

Bus.$on('cart.add', el => {

this.$nextTick(() => {

this.$refs.shopcart.drop(el);

});

});

},

3.shopcart.vue

methods: {

drop(el) {

console.log(el);

}

}

会发现已打印出dom

09936dfb979bec7d5037aec6d9c7bfa6.png

报错Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.

原因:只能有一个根节点,所以在外层要包裹一个层

11afed4dea20f40816777d0e8c946ba1.png

打开新页面

父组件可以调用子组件的方法,子组件不能调用父组件的方法,

调用子组件的方法:

父组件:通过refs传递

methods: {selectFood(food,event) {if (!event._constructed) {return;

}this.selectFood =food;this.$refs.food.show(); //调用子组件的方法

}

},

子组件food的方法:

export default {

props: {

food: {

type: Object

}

},

data() {

return {

showFlag: false

};

},

methods: {

show() {

this.showFlag = true;

}

}

};

created(),mounted()....这些生命周期钩子函数,所以要加(),

methods,coputed...这些是对象,里面还可放属性或方法,vue内部会遍历这些对象加到对应的宿主上。

data(),created() 都是 简写。

图片自适应,宽度和高度大小一样,实现高速自适应

https://segmentfault.com/a/1190000004231995

.image-header {

position: relative;

width: 100%;

height: 0;

padding-top: 100%;

over-flow:hidden;

img {

position: absolute;

top: 0;

left: 0;

width: 100%;

height: 100%;

}

}

报错Unexpected tab character,解决方法:在eslint.js里面加入

'no-tabs':'off',

vue对点击的li添加class,传值

在data里面定义一个i,在方法里面,让i等于index,通过判断i和index是否相等,添加class

html

  • {{item.title}}

js

toggle (item, index) {

this.isDetail = !this.isDetail

this.title = item

this.i = index

}

data定义i

data () {return{

news: {

},

isDetail:false,i: -1,

title:'',

items: [{

content:'标题1内容',

title:'标题1'}, {

content:'2 item',

title:'标题2'}, {

content:'3 item',

title:'标题3'}]

}

},

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值