Dieses Mal erkläre ich Ihnen, wie Sie die shopCart-Komponente von Vue verwenden Vorsichtsmaßnahmen Hier ist ein praktischer Fall.
1. ShopCart-Komponente
(1) Waren-Mutterkomponente und Unterkomponente ShopCart-Übergabeparameter
deliveryPrice:{ // 单价 从json seller 对象数据中获取 type:Number, default:0 }, minPrice:{ // 最低起送价 从json seller 对象数据中获取 type:Number, default:20 }
wobei die Daten von Lieferpreis und minPrice werden beide vom Verkäuferobjekt in data.json-Daten abgerufen. Daher müssen die Daten des Verkäuferobjekts in der Warenkomponente abgerufen werden, andernfalls wird ein Fehler gemeldet:
[Vue warn]: Fehler beim Rendern: „TypeError: Cannot read property ‚deliveryPrice‘ von undefiniert"
Lösung: Die Router-View-Komponente in der Root-Komponente App.vue erhält die Verkäuferdaten und übergibt sie an die Warenkomponente
1-1.app.vue (Die Stammkomponente ist auch die übergeordnete Komponente von Waren) )
<keep-alive> <router-view :sell="sellerObj"></router-view> </keep-alive>
Hinweis: sellerObj wird verwendet, um data.json-Daten in dem durch Daten definierten Objekt zu empfangen, was dem tatsächlichen Parameter entspricht
1-2.goods.vue (relativ zur Komponente) Unterkomponente und übergeordnete Komponente von shopCart)
Kommunikation zwischen Komponenten über Requisitenattribute
props: { sell: Object // 相当于 形参 },
1-3.shopCart .vue (Unterkomponente von Waren)
<shopCart :delivery-price="sell.deliveryPrice" :min-price="sell.minPrice"></shopCart>
(2) Berechnungsfunktion ausgewählter Produkte
1-1. Übergeben Sie die Sammlung der vom Benutzer ausgewählten Produkte
Beschreibung: Ein vom Benutzer ausgewähltes Array wird von der übergeordneten Komponente übergeben. Im Array werden n Objekte gespeichert, und jedes Objekt speichert den Preis und die Menge des Produkts.
props:{ // 通过父组件传过来的 ( 相当于形参 ) selefoodsArr:{ // 用户选中的商品存放在一个数组里 接收的是 data.json数据的 goods(数组) type:Array, // 当父组件传过来的 类型是对象或者 是数组时, default 就是一个函数 default (){ return [] // 返回数组 存放着选中 商品 对应的 goods下的 foods 数组(由 父组件 的 实参 决定的返回值) } }
1-2. Verwenden Sie berechnete Attribute, um Änderungen der Produktmenge, des Gesamtproduktpreises, der dynamischen Änderung von Beschreibungen und anderer Funktionen auszuwählen
computed:{ totalPrice (){ //计算总价,超过起送额度后提示可付款 let total=0 // 定义一个返回值 this.selefoodsArr.forEach((rfoods) =>{ // 遍历 这个 goods 数组 取到 价格 和 数量 (当然在这里数据库没有count 这个属性,稍后 我们会利用 vue.set() 新建一个count 属性) total += rfoods.price * rfoods.count // 形参 rfoods 实参 是 foods }); return total; }, totalCount (){ // //计算选中的food数量,在购物车图标处显示,采用绝对定位,top:0;right:0;显示在购物车图标右上角 let count=0 this.selefoodsArr.forEach((rfoods) =>{ // 形参 rfoods 实参 是 foods count += rfoods.count }); return count; }, payDesc (){ //控制底部右边内容随food的变化而变化,payDesc()控制显示内容,enough 添加类调整显示样式 let diff = this.minPrice - this.totalPrice if (!this.totalPrice) { return `¥${this.minPrice}起送` } else if (diff > 0) { return `还差¥${diff}元` } else { return '去结算' } } }
Dies wird in die Vorlage gerendert
<p class="shopCart"> <p class="content"> <p class="content-left"> <p class="logo-wrapper"> <!--徽章 展示选中商品的个数--> <p class="badge" v-show="totalCount"> {{totalCount}} </p> <!--购物车 图标 选择商品和未选择商品 时 动态改变 样式 条件:只要选择了商品即总价不为0 ,样式变--> <p class="logo" :class="{'active':totalCount}"> <i class="icon-shopping_cart"></i> </p> </p> <!--同理: 总价 不为0 字体高亮--> <p class="price" :class="{'active':totalPrice}"> ¥{{totalPrice}} </p> <!--配送费 data.json 提供--> <p class="desc"> 另需要配送费¥{{deliveryPrice}}元 </p> </p> <!--根据条件 动态 改变样式--> <p class="content-right" :class="{'enough':totalPrice>=minPrice}"> {{payDesc}} </p> </p> </p>
Verwandte Stile
&.active color white &.enough background #00b43c color white
Zusammenfassung: Durch das obige Lernen können wir feststellen, dass Änderungen in selectFoods() eine Schlüsselrolle spielen wird sich letztendlich in der Schnittstelle widerspiegeln, und wir müssen nicht auf die spezifische Implementierung innerhalb des DOM achten. Dies ist ein großer Vorteil von vue. Es wäre etwas kompliziert, diese Funktionen mit jQuery auszuführen.
2. CartControl-Komponente
Beschreibung: Diese Komponente steuert den Warenkorbball. Dabei handelt es sich um die Animation des Balls.
(1) Neue Attributanzahl
Beschreibung:
Fügen Sie den Lebensmitteln unter Waren eine Attributanzahl hinzu, um die vom Benutzer ausgewählten Artikel zu speichern der Produkte, Berechnung des Gesamtpreises des Produkts und Änderungen der zugehörigen Abzeichen (Anzeige der Anzahl der vom Benutzer ausgewählten Produkte)
Methode: Vue aus „vue“ importieren; die festgelegte Schnittstelle verwenden und Attribute hinzufügen vue.set() kann erkannt werden, wenn es sich ändert, sodass die übergeordnete Komponente den Zählwert erhalten kann (der beim Durchlaufen der ausgewählten Produkte verwendet wird)
methods:{ addCart(event){ // 点击count 加, //console.log(event.target); if (!event._constructed) { // 去掉自带click事件的点击 return; } if(!this.foodsele.count){ Vue.set(this.foodsele, 'count', 1) }else{ this.foodsele.count++ } }, decreaseCart (event){ // 点击减少 if (!event._constructed) { // 去掉自带click事件的点击 return; } if(this.foodsele.count){ this.foodsele.count -- } } }
(2) Fügen Sie eine Schaltfläche hinzu, um den Übergang zu implementieren
Der Effekt, den wir erzielen möchten, ist: Wenn auf die Schaltfläche „Hinzufügen“ geklickt wird, werden das Erscheinungsbild der Schaltfläche und einige Animationseffekte, begleitet von Rotations-, Übersetzungs- und Transparenzänderungen, reduziert
<transition name='move'> <!--平移动画--> <p class="cart-decrease" v-show="foodsele.count" @click='decreaseCart($event)'> <span class="icon-remove_circle_outline inner"></span><!--旋转、透明度动画--> </p> </transition>
.cart-decrease display inline-block padding 6px transition: all .4s linear /*过渡效果的 CSS 属性的名称、过渡效果需要多少时间、速度效果的速度曲线*/ .inner line-height 24px font-size 24px color rgb(0,160,220) transition all 0.4s linear &.move-enter-active, &.move-leave-active transform translate3d(0,0,0) /* 这样可以开启硬件加速,动画更流畅,3D旋转,X轴位移24px */ .inner display inline-block /* 设置成inline-block才有高度,才能有动画 */ transform rotate(0) &.move-enter, &.move-leave-active opacity: 0 transform translate3d(24px,0,0) .inner transform rotate(180deg)
3. Parabolische Ballanimation
Der Ball wird durch zwei Ebenen gesteuert. Die äußere Ebene steuert die Änderung in eine Richtung und die innere Ebene steuert die Änderung in die andere Richtung (schreiben Sie zwei Ebenen an). haben einen Parabeleffekt), unter Verwendung eines festen Layouts (Es handelt sich um eine Animation relativ zum Ansichtsfenster)
Ereignisemission und -empfang
Übergabe von Werten zwischen Komponenten-1
Übergeben von Werten zwischen Komponenten-2
Erweiterung
Vue1.0-Komponentenübertragung
Verwenden Sie $on() zu auf Ereignisse achten;
Verwenden Sie $emit(), um Ereignisse darauf auszulösen;
Verwenden Sie $dispatch(), um Ereignisse auszulösen, die sprudeln entlang der übergeordneten Kette;
Verwenden Sie $broadcast(), um Ereignisse zu übertragen, und die Ereignisse werden an alle Nachkommen weitergegeben
(1 ) Übergabe von Daten zwischen Vue2.0-Komponenten
1-1 . Wenn Sie klicken, um die Menge hinzuzufügen, lösen Sie ein Ereignis über das Attribut $emit in der Methode addCount in der Komponente „cartControl“ aus und übergeben Sie das angeklickte Objekt
addCart(event){ // 点击count 加, // console.log(event.target); if (!event._constructed) { // 去掉自带click事件的点击 return; } if(!this.foodsele.count){ Vue.set(this.foodsele, 'count', 1) }else{ this.foodsele.count++ } // 当点击 添加数量时 通过 $emit 属性 提交一个名为 add 给父组件 // 子组件通过 $emit触发 add事件 ,将参数传递给父组件 this.$emit('add', event.target); }
1-2. Betreiben Sie die Warenkomponente
zum Einkaufen. Wenn die Autokomponente das addCart-Ereignis sendet, ruft sie die Add-Funktion auf
<cart-control :foodsele='food' @add="addFood"></cart-control>
Die übergeordnete Komponente Verwenden Sie @add="addFood", um das von der untergeordneten Komponente vm.$emit ausgelöste Ereignis abzuhören, und akzeptieren Sie das von der untergeordneten Komponente über addFood() übergebene Ereignis. Die Daten benachrichtigen die übergeordnete Komponente, dass sich die Daten geändert haben.
addFood(target) { this._drop(target); }
1-3. 父组件访问子组件 vue 提供了接口 ref
复制代码 代码如下:
_drop(target) { // 体验优化,异步执行下落动画 this.$nextTick(() => { this.$refs.shopCart.balldrop(target);// 将target传入shopCart子组件中的balldrop方法,所以drop方法能获得用户点击按钮的元素,即能获取点击按钮的位置 }); }
区别 访问DOM 变量
1-3. 操作 shopCart 组件
data (){ // 定义一个数组 来 控制小球的状态 定义多个对象,表示页面中做多同时运动的小球 return{ // 定义 5 个 小球 balls:[{show:false},{show:false},{show:false},{show:false},{show:false}], dropBalls:[] // 接收下落小球 } }
methods:{ balldrop(ele) { // console.log(el) 取到点击 对象 for(var i=0;i<this.balls.length;i++){ let ball=this.balls[i] if(!ball.show){ ball.show=true ball.ele=ele this.dropBalls.push(ball) return; } } } }
动画过程开始,利用vue 提供的钩子函数
beforeEnter (el){ //找到所以设为true的小球 let count=this.balls.length while(count--){ let ball = this.balls[count]; if(ball.show){ let pos=ball.el.getBoundingClientRect() //返回元素相对于视口偏移的位置 let x=pos.left-32 // 点击的按钮与小球(fixed)之间x方向的差值 let y=-(window.innerHeight-pos.top-22) el.style.display = ''; //设置初始位置前,手动置空,覆盖之前的display:none,使其显示 el.style.webkitTransform = `translate3d(0,${y}px,0)`; //外层元素做纵向的动画,y是变量 el.style.transform = `translate3d(0,${y}px,0)`; let inner = el.getElementsByClassName('inner_hook')[0];//内层元素做横向动画,inner-hook(用于js选择的样式名加上-hook,表明只是用 //于js选择的,没有真实的样式含义) inner.style.webkitTransform = `translate3d(${x}px,0,0)`; inner.style.transform = `translate3d(${x}px,0,0)`; } } }, enter(el) { /* eslint-disable no-unused-vars */ let rf = el.offsetHeight; this.$nextTick(() => {//异步执行 el.style.webkitTransform = 'translate3d(0,0,0)'; //重置回来 el.style.transform = 'translate3d(0,0,0)'; let inner = el.getElementsByClassName('inner_hook')[0]; inner.style.webkitTransform = 'translate3d(0,0,0)'; inner.style.transform = 'translate3d(0,0,0)'; }); }, afterEnter(el) { let ball = this.dropBalls.shift(); //取到做完动画的球,再置为false,即重置,它还可以接着被利用 if (ball) { ball.show = false; el.style.display = 'none'; } }
<p class="ball-container"> <p v-for="ball in balls"> <transition name="drop" @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter"> <p class="ball" v-show="ball.show"> <p class="inner inner_hook"></p> </p> </transition> </p> </p>
&.drop-enter,&.drop-enter-active transition all 0.4s cubic-bezier(0.49,-0.29,0.75,0.41) .inner width 16px height 16px border-radius 50% background rgb(0,160,220) transition all 0.4s linear
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
Das obige ist der detaillierte Inhalt vonSo verwenden Sie die shopCart-Komponente von Vue. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!