この記事では主にVueのshopCartコンポーネント開発の詳細な説明を紹介していますが、編集者が非常に優れていると感じたので、参考として共有します。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。
1. shopCartコンポーネント
(1)商品の親コンポーネントとサブコンポーネントのshopCartの渡しパラメータ
deliveryPrice:{ // 单价 从json seller 对象数据中获取 type:Number, default:0 }, minPrice:{ // 最低起送价 从json seller 对象数据中获取 type:Number, default:20 }
deliveryPriceとminPriceのデータはdata.jsonデータ内のsellerオブジェクトから取得します。したがって、販売者オブジェクトのデータは商品コンポーネントで取得する必要があります。取得しないと、エラーが報告されます:
[Vue warn]: レンダリング時のエラー: "TypeError: Cannot read property 'deliveryPrice' of unknown"
解決策: ルートコンポーネント App.vue のルータービューコンポーネントは販売者のデータを取得し、商品コンポーネント
1-1.app.vue (ルートコンポーネントは商品の親コンポーネントでもあります) に渡します
<keep-alive> <router-view :sell="sellerObj"></router-view> </keep-alive>
注: sellObj は、data.json データを受信するために使用される data によって定義されたオブジェクトであり、実際のパラメーター
1-2.goods.vue (コンポーネントのサブコンポーネントおよび shopCart の親コンポーネントに関連) に相当します
props属性によるコンポーネント間の通信
props: { sell: Object // 相当于 形参 },
1-3.shopCart.vue(商品のサブコンポーネント)
<shopCart :delivery-price="sell.deliveryPrice" :min-price="sell.minPrice"></shopCart>
(2) 選択された商品の計算関数
1-1のコレクションを渡します。ユーザーが選択した商品
説明: 親コンポーネントから、ユーザーが選択した製品の配列を渡します。n 個のオブジェクトが配列に格納され、各オブジェクトには製品の価格と数量が格納されます。
props:{ // 通过父组件传过来的 ( 相当于形参 ) selefoodsArr:{ // 用户选中的商品存放在一个数组里 接收的是 data.json数据的 goods(数组) type:Array, // 当父组件传过来的 类型是对象或者 是数组时, default 就是一个函数 default (){ return [] // 返回数组 存放着选中 商品 对应的 goods下的 foods 数组(由 父组件 的 实参 决定的返回值) } }
1-2. 計算された属性を使用して、商品数量、商品合計価格の変更を選択し、説明やその他の機能を動的に変更します
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 '去结算' } } }
このようにして、テンプレートにレンダリングされます
<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>
関連スタイル
&.active color white &.enough background #00b43c color white
概要: 上記の学習を通じて、selectFoods() の変更が重要な役割を果たし、その変更が DOM の変更を引き起こし、最終的にはインターフェイスに反映されることがわかります。 DOM 内の特定の実装に注意を払う必要はありません。これは、vue の大きな利点の 1 つです。 jQuery を使用してこれらの機能を実行するのは少し複雑になります。
2. CartControl コンポーネント
説明: このコンポーネントはショッピング カート ボールを制御します。ボールのアニメーションが含まれます
(1) 属性カウントを追加します
手順:
商品の下の食品に属性カウントを追加します。これは、ユーザーが選択した商品の数を保存するために使用され、商品の合計価格を計算します。製品と関連付けられたバッジ ( ユーザーが選択した製品の数の変化を表示します
方法: 'vue' から Vue をインポートします。set インターフェイスを使用し、vue.set() を通じて属性を追加します。変更されると、検出され、親コンポーネントがカウント値を取得できるようにします (選択した製品をトラバースするときに使用されます)
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) トランジションを実装するボタンを追加します
達成したい効果は次のとおりです: 追加ボタンクリックすると、縮小ボタンが表示され、回転、移動、および透明度の変化のアニメーション効果が伴います
<transition name='move'> <!--平移动画--> <p class="cart-decrease" v-show="foodsele.count" @click='decreaseCart($event)'> <span class="icon-remove_circle_outline inner"></span><!--旋转、透明度动画--> </p> </transition>
3. 放物線ボールアニメーション
は、2つのレイヤーを通してボールを制御します。変更 (放物線効果を持たせるために 2 つのレイヤーを作成)、固定レイアウト (ビューポートを基準としたアニメーション) を使用します
イベントの発行と受信コンポーネント間で渡される値。 -1コンポーネント間で渡される値 -2
Extension
Vue1.0 コンポーネントの転送
$on() を使用してイベントをリッスンします- $emit() を使用してイベントをトリガーします;
- $dispatch() を使用してイベントをディスパッチし、イベントは親チェーンに沿ってバブルします。
- は $broadcast() を使用してイベントをブロードキャストし、イベントはすべての子孫に伝播されます
- ( 1) Vue2.0 コンポーネント間でデータを転送します
.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)
1-2.商品コンポーネントを操作する
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); }
親コンポーネントは、子コンポーネントによってトリガーされるイベントをリッスンするために @add="addFood" を使用しますvm.$emit は、addFood() を通じて子コンポーネントから渡されたデータを受け取り、データの変更を親コンポーネントに通知します。
<cart-control :foodsele='food' @add="addFood"></cart-control>
1-3. 親コンポーネントは子コンポーネントの vue にアクセスします ref を提供します
コードをコピーします
コードは次のとおりです:addFood(target) { this._drop(target); }
_drop(target) { // 体验优化,异步执行下落动画 this.$nextTick(() => { this.$refs.shopCart.balldrop(target);// 将target传入shopCart子组件中的balldrop方法,所以drop方法能获得用户点击按钮的元素,即能获取点击按钮的位置 }); }vue
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; } } } }
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'; } }
関連おすすめ:
vuejsは再帰コンポーネントを使用してツリーディレクトリを実装します
以上がVue shopCartコンポーネントの開発事例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

C++中的众数函数详解在统计学中,众数指的是一组数据中出现次数最多的数值。在C++语言中,我们可以通过编写一个众数函数来找到任意一组数据中的众数。众数函数的实现可以采用多种不同的方法,下面将详细介绍其中两种常用的方法。第一种方法是使用哈希表来统计每个数字出现的次数。首先,我们需要定义一个哈希表,将每个数字作为键,出现次数作为值。然后,对于给定的数据集,我们遍

C++中的取余函数详解在C++中,取余运算符(%)用于计算两个数相除的余数。它是一种二元运算符,其操作数可以是任何整数类型(包括char、short、int、long等),也可以是浮点数类型(如float、double)。取余运算符返回的结果与被除数的符号相同。例如,对于整数的取余运算,我们可以使用以下代码来实现:inta=10;intb=3;

Vue.nextTick函数用法详解及在异步更新中的应用在Vue开发中,经常会遇到需要进行异步更新数据的情况,比如在修改DOM后需要立即更新数据或者在数据更新后需要立即进行相关操作。而Vue提供的.nextTick函数就是为了解决这类问题而出现的。本文就会详细介绍Vue.nextTick函数的用法,并结合代码示例来说明它在异步更新中的应用。一、Vue.nex

在Web应用程序中,缓存通常是用来优化性能的重要手段。Django作为一款著名的Web框架,自然也提供了完善的缓存机制来帮助开发者进一步提高应用程序的性能。本文将对Django框架中的缓存机制进行详解,包括缓存的使用场景、建议的缓存策略、缓存的实现方式和使用方法等方面。希望对Django开发者或对缓存机制感兴趣的读者有所帮助。一、缓存的使用场景缓存的使用场景

PHP-FPM是一种常用的PHP进程管理器,用于提供更好的PHP性能和稳定性。然而,在高负载环境下,PHP-FPM的默认配置可能无法满足需求,因此我们需要对其进行调优。本文将详细介绍PHP-FPM的调优方法,并给出一些代码示例。一、增加进程数默认情况下,PHP-FPM只启动少量的进程来处理请求。在高负载环境下,我们可以通过增加进程数来提高PHP-FPM的并发

在PHP开发中,有时我们需要判断某个函数是否可用,这时我们便可以使用function_exists()函数。本文将详细介绍function_exists()函数的用法。一、什么是function_exists()函数?function_exists()函数是PHP自带的一个内置函数,用于判断某个函数是否被定义。该函数返回一个布尔值,如果函数存在返回True,

PHPstrpos()函数用法详解在PHP编程中,字符串处理是非常重要的一部分。PHP通过提供一些内置函数来实现字符串处理。其中,strpos()函数就是PHP中最常用的一个字符串函数之一。该函数的目的是在一个指定的字符串中搜索另一个指定字符串的位置,如果包含则返回这个位置,否则返回false。本文将通过详细分析PHPstrpos()函数的用法,助你更好

Gin框架是目前非常流行的Go语言Web框架之一。作为一个轻量级的框架,Gin提供了丰富的功能和灵活的架构,使得它在Web开发领域中备受欢迎。其中一个特别重要的功能是模板渲染。在本文中,我们将介绍Gin框架的模板渲染功能,并深入了解它的实现原理。一、Gin框架的模板渲染功能Gin框架使用了多种模板渲染引擎来构建Web应用程序。目前,它支持以下几种模板引擎:


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

Dreamweaver Mac版
ビジュアル Web 開発ツール

SublimeText3 中国語版
中国語版、とても使いやすい

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

ホットトピック









