ããã«ã¡ã¯ãHabrïŒ Paul Redmondã«ããèšäºVue.jsãã¥ãŒããªã¢ã«ïŒjQueryããVue.jsãžã®ç¿»èš³ã玹ä»ããŸãã
JavaScriptã©ã€ãã©ãªã«é¢ããŠã¯ãjQueryã»ã©äººæ°ã®ããã©ã€ãã©ãªã¯ãããŸããã§ããã ãã©ãŠã¶ã®äºææ§ãéçºè
ã«ãšã£ãŠéèŠãªåé¡ã§ãã£ããšãã«ãCSSã»ã¬ã¯ã¿ãŒã䜿çšããŠDOMèŠçŽ ããã€ãã¹ããããã«äœæãããŸããã
å®éãjQueryã¯éåžžã«æ±çšæ§ãé«ããããã³ã³ããŒãã³ãJavaScriptã䜿çšããŠVueã§UIãäœæããçç±ãå®å
šã«äŒãããšæããŸããã ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãæåã«jQueryã䜿çšããŠãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãäœæãã次ã«Vueã䜿çšããŠãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãæžãæããŸãã
ãããžã§ã¯ã
JavaScriptã䜿çšããŠè€æ°ã®ãã£ãŒã«ããåçã«è¿œå ããããã©ãŒã ãããå Žåãéåžžã«äžè¬çã§ãã ãŠãŒã¶ãŒãè€æ°ã®ãã±ããã賌å
¥ã§ãããªã³ã©ã€ã³ç»é²ãã©ãŒã ããããåãã±ããã®ååãšã¡ãŒã«ã¢ãã¬ã¹ãå¿
èŠã ãšæ³åããŠãã ããã
ãããæåã«jQueryã«å®è£
ããããšã¯ãVueã§åãããšãè¡ãåã®è¯ãã¹ãããã§ãã å€ãã®éçºè
ã¯jQueryã«ç²ŸéããŠãããåçã€ã³ã¿ãŒãã§ã€ã¹ãäœæããããã«äœ¿çšãã¹ãéåžžã«ç°ãªãã¢ãããŒããšåªããã³ã³ãã©ã¹ããæäŸããŸãã
jQueryãšVue on Code Pen ã䜿çšããŠã³ãŒãäŸãäœæããŸããã
jQueryã䜿çšããããŒãžã§ã³
jQueryã䜿çšããŠãã®ã€ã³ã¿ãŒãã§ã€ã¹ãæ§ç¯ããæ¹æ³ã¯å€æ°ãããŸãã ããšãã°ãHTMLããŒã¯ã¢ããã«1ã»ããã®ãã£ãŒã«ããæã€ãã©ãŒã ãäœæãããŠãŒã¶ãŒãããã«è¿œå ãããšãã«jQueryã«DOMãžã®è¿œå ãã£ãŒã«ãã®åçè¿œå ãè¡ãããããšãã§ããŸãã
<script type = "text/template">
ãè¡ãã³ãã¬ãŒããšããŠäœ¿çšããããã©ã«ãã§DOMContentLoadedã«è¿œå ããããšãã§ããŸããããã䜿çšããã¢ãããŒãã§ãã
jQuery HTMLãã³ãã¬ãŒã
ãã³ãã¬ãŒãã®äœ¿çšã¯ãVueã§ã³ã³ããŒãã³ããäœæããæ¹æ³ãšããæŽåæ§ããããŸãã HTMLããŒã¯ã¢ããã¯æ¬¡ã®ããã«ãªããŸãã
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>jQuery Checkout UI</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css"> <style type="text/css"> body { margin: 3em } button { cursor: pointer; } .unit-price { margin-right: 2rem; color: #999; } </style> </head> <body> <div class="container" id="app"> <form> <div class="attendee-list"></div> <div class="row justify-content-center"> <div class="col-sm-6"></div> <div class="col-sm-2"> <button type="button" class="btn btn-secondary add-attendee">Add Attendee</button> </div> </div> <hr> <div class="row justify-content-center"> <div class="col-sm-6"> <span id="unit-price" class="unit-price"></span> </div> <div class="col-sm-2 text-left"> <button type="submit" id="checkout-button" class="btn btn-primary"> Pay <span class="amount"></span></button> </div> </div> </form> </div> <script type="text/template" data-template="attendee"> <div class="attendee row justify-content-center"> <div class="col-sm-3"> <div class="form-group"> <label class="sr-only">Name</label> <input class="form-control" placeholder="Enter name" name="attendees[][name]" required> </div> </div> <div class="col-sm-3"> <div class="form-group"> <label class="sr-only">Email address</label> <input type="email" class="form-control" placeholder="Enter email" name="attendees[][email]" required> </div> </div> <div class="col-sm-2 text-left"> <button type="button" class="btn btn-light remove-attendee"> <span aria-hidden="true">Ã</span> Remove </button> </div> </div> </script> <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script> <script src="app.js"></script> </body> </html>
ã¬ã€ã¢ãŠãã«ã¯Bootstrap 4ã®ããŒã¿çã䜿çšããŸãã $ïŒããã¥ã¡ã³ãïŒ.readyïŒïŒã®ããŒã¿ãå
¥åãããjQueryãã¬ãŒã¹ãã«ããŒãããã€ãç¹å®ããŸããããããŒã¯ã¢ããããäœãèµ·ãã£ãŠããã®ããå€æããã®ã¯å°é£ã§ãã ç®çã®æ©èœã®æå³ãç解ããã«ã¯ãHTMLãšJavaScriptãåæã«èŠãå¿
èŠããããŸãã æ°ãæã§ãã®ãããžã§ã¯ãã«æ»ãã«ã¯ãäœãèµ·ãã£ãŠããã®ããç解ããããã«ããªãã®ç²Ÿç¥çåªåãå¿
èŠã§ãã
app.jsãã¡ã€ã«ã§ã1ã€ã®ãã±ããã®äŸ¡æ ŒãšåèšäŸ¡æ Œãå
¥åããŸããããã¯ããã§ãã¯ãã¿ã³ã§JavaScriptã䜿çšããŠè¡šç€ºãããŸãã ãŠãŒã¶ãŒã[åå è
ã®è¿œå ]ãã¿ã³ãã¯ãªãã¯ãããã³ã«ããã³ãã¬ãŒããã<div class="attendee-list"></div>
ã³ã³ãããŒã«æ°ããè¡ãè¿œå ããŸãã
åå è
ã®ãªã¹ãã«ãã©ãŒã ã®ç¹°ãè¿ããã£ãŒã«ããèšå
¥ããã«ã¯ãã¯ã©ã€ã¢ã³ããã³ãã¬ãŒããšããŠ<script>
ã䜿çšããŸãã type = "text / template"ãåå ã§ããã©ãŠã¶ã¯ã¹ã¯ãªãããç¡èŠããŸããã€ãŸããå®è¡ãããŸããã
çµäºã¿ã°ã®é£ã§ãjQueryãšapp.jsã®ææ°ããŒãžã§ã³ã䜿çšããŸãããã®ããŒãžã§ã³ã§ã¯ãåçãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®æŽæ°ã®äœæ¥ãéå§ããŸãã
JQueryã®åæå
jQueryã§ããŒãžã§ã³ã®äœæãéå§ããã«ã¯ããã©ãŒã ãåæåããåèšéé¡ãèšç®ããããã©ã«ãã®è¡ãè¿œå ããŠãããŒã¿ããäŸ¡æ Œãèšå®ããŸãããã
ã³ãŒãã®æåã®éšåã¯ã1ã€ã®äŸ¡æ Œããããã£ãå«ãããŒã¿ãªããžã§ã¯ããªãã©ã«ãèšå®ããŸãã äŸ¡æ Œã¯1æã®ãã±ããã®äŸ¡æ Œã§ãã 1ã€ã®ãã±ããã®äŸ¡æ Œãåçã«èšå®ããããšãã§ããŸãããããã§ã¯åçŽã«ããŒãã³ãŒãã£ã³ã°ãããŠããŸãã
DOMã¯ãšãªã䜿çšããŠåå è
ã®æ°ãååŸãããªã©ãããã€ãã®ãã«ããŒé¢æ°ããããŸãã DOMã䜿çšããããšããjQueryã䜿çšããŠãã®å€ã決å®ããå¯äžã®æ£ç¢ºãªæ¹æ³ã§ãã
2çªç®ã®ãã«ããŒé¢æ°ã¯ãããŒã¯ã¢ããã®ãã³ãã¬ãŒãã䜿çšããŠãªã¹ãã«æ°ããã¡ã³ããŒãè¿œå ããŸãã
syncPurchaseButtonïŒïŒé¢æ°ã¯getAttendeeCountïŒïŒã䜿çšããŠèšç®ãã賌å
¥ãã¿ã³ã«æçµçãªéé¡ãå
¥åããŸãã
ãã³ãã¬ãŒãã®ã©ãã§ãåã賌å
¥éé¡ãååŸãããå Žåã¯ãã¯ã©ã¹ã»ã¬ã¯ã¿ãŒã䜿çšããŠDOMã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãåæããå¿
èŠããããŸããããã®å Žåã¯1ã€ã®ã¿ã«çŠç¹ãåœãŠãŠããŸãã
ãã®æç¹ã§ããŒãžãããŒããããšã1人ã®ãã±ããã®äŸ¡æ Œãšãã§ãã¯ãã¿ã³ã®åèšéé¡ã§ã1人ã®èšªåè
ã«ãã£ãŠãã©ãŒã ãåæåãããŸãã
jQueryã䜿çšããŠã¡ã³ããŒãè¿œå ãã
次ã«ãã¡ã³ããŒã®è¿œå ãšåé€ãæ€èšããŸãããã jQueryã«ã¯ãã«ã¹ã¿ã ã€ãã³ãã®ããªã¬ãŒãªã©ãåªããã€ãã³ãåŠçããããŸãã æ°ããã¡ã³ããŒãè¿œå ããããã«å¿
èŠãªã³ãŒãããå§ããŸãããã
function addAttendee() { $('.attendee-list').append( $('script[data-template="attendee"]').text() );
syncRemoveButtonsïŒïŒé¢æ°ã¯ããã£ãŒã«ãã1ã€ããæ®ã£ãŠããªãå ŽåããŠãŒã¶ãŒããã£ãŒã«ããåé€ã§ããªãããã«ããŸãããè€æ°ã®è¡ãããå ŽåããŠãŒã¶ãŒã¯ä»»æã®è¡ãåé€ã§ããŸãã
次ã«ãaddAttendeeïŒïŒé¢æ°ã§syncRemoveButtonsïŒïŒãåŒã³åºããŸããã€ãŸããããŒãžãæŽæ°ãããšãåå è
ã1人ã ããªã®ã§åé€ãã¿ã³ãé衚瀺ã«ãªããŸãã
ã¡ã³ããŒè¿œå ã€ãã³ããã³ãã©ãŒã¯addAttendeeïŒïŒé¢æ°ãåŒã³åºããåºåžè
ãèµ·åããŸãïŒã«ã¹ã¿ã ã€ãã³ããè¿œå ããŸãã
ã«ã¹ã¿ã ã€ãã³ããã³ãã©ãŒã§ãåèšäŸ¡æ ŒãåæããŠãã¿ã³ãæ£ããããã«ãã次ã«ãäžèšã®ããã«syncRemoveButtonsïŒïŒãåŒã³åºããŠåé€ãã¿ã³ã®ã¹ããŒã¿ã¹ãæŽæ°ããŸãã
jQueryãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã倧ãããªããšãåæã¹ããŒã¿ã¹ãæã«è² ããªããªãå¯èœæ§ããããŸãã ç¶æ
ãæ瀺çã«ç®¡çããã€ãã³ãã«å¿ããŠç¶æ
ãå€åãããšãã«åæããå¿
èŠããããŸãããŸããåã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
åæã®æ©èœãç解ããå¿
èŠããããŸãã
jQueryã®ç¶æ
管çã¯ãããŸããŸãªæ¹æ³ã§åŠçããDOMã«ãªã³ã¯ã§ãããããè¿œå ã®ç²Ÿç¥çãªåªåãå¿
èŠã§ãã ç¶æ
ãDOMã«äŸåããŠããããã®éã§ã¯ãªãå Žåãç¶æ
ã远跡ããDOMèŠæ±ã¯è€éã«ãªããŸãã
jQueryã䜿çšããŠã¡ã³ããŒãåé€ãã
ãã®æç¹ã§ãããŒãžãæŽæ°ãããšããã©ãŒã ã«æ°ããè¡ãè¿œå ã§ããŸãã æåã®è¿œå åå è
ãè¿œå ãããšãè¡ããšã«åé€ãã¿ã³ã衚瀺ãããè¡ãåé€ã§ããŸãã
次ã«ãåé€ã€ãã³ããããã¯ããŠãåé€åŸã«ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®ç¶æ
ã衚瀺ãããããšã確èªããŸãã
DOM ID #appã«ã¯ãªãã¯ã€ãã³ããªã¹ããŒãè¿œå ããŸãããããã«ãããæ°ããè¡ã®ã¯ãªãã¯ã€ãã³ãã«åçã«å¿çã§ããŸãã ãã®ãã³ãã©ãŒå
ã§ãæ¢å®ã®ãã¿ã³ã€ãã³ããé²æ¢ããDOMããªãŒã§æãè¿ã.rowã®ç¥å
ãèŠã€ããŸãã
$è¡ã®èŠªãèŠã€ãã£ããããããDOMããåé€ããåºåžè
ãèµ·åããŸãïŒã«ã¹ã¿ã ã€ãã³ããåé€ããŸãã
åºåžè
ïŒã€ãã³ããã³ãã©ãŒã®åé€ã§ã¯ã賌å
¥ãã¿ã³ãšåé€ãã¿ã³ã®ç¶æ
ãåæããŸãã
æºåãã§ããjQueryããŒãžã§ã³
çŸæç¹ã§ã¯ããã©ãŒã ã®UIã®jQueryãããã¿ã€ããæ©èœããŠãããããã䜿çšããŠVueããŒãžã§ã³ãšæ¯èŒã§ããŸãã
å®å
šãªapp.jsãã¡ã€ã«ã¯æ¬¡ã®ãšããã§ãã
$(document).ready(function () { var data = { cost: 9.99 }; function getAttendeeCount() { return $('.attendee-list .row.attendee').length; } function addAttendee() { $('.attendee-list').append( $('script[data-template="attendee"]').text() ); syncRemoveButtons(); } function syncRemoveButtons() {
ãã®äŸã®ç®çã¯ãããããäœæãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®çš®é¡ã瀺ããVue.jsãšæ¯èŒããŠã©ã®ããã«èŠãããã瀺ãããšã§ãã ããã§éèŠãªçµè«ã¯ãDOMã«çŽæ¥ãã€ã³ããããç¶æ
ã§ããDOMã«ã¯ãšãªãå®è¡ããŠãç¶æ
ã«é¢ããçµè«ãåºãå¿
èŠããããŸãã
JQueryã§ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãäœæã§ããŸãããVueã䜿çšããŠåãæ©èœãäœæããæ¹æ³ãèŠãŠã¿ãŸãããã
Vueã®æŠèŠ
ã»ãšãã©ã®äººã¯ããããçŸæç¹ã§Vueãèããããšãããã§ãããããVueã«æ
£ããŠããªã人ã«ãšã£ãŠã¯ããã®ã¬ã€ãã¯æé©ãªå Žæã§ãã
ä»ã®ãã¬ãŒã ã¯ãŒã¯ãšã®æ¯èŒã¯ããã§ã«æ
£ã芪ããã§ããä»ã®ãã¬ãŒã ã¯ãŒã¯ãšã¯å¯Ÿç
§çã«ãVueãèªèããã®ã«ã圹ç«ã¡ãŸãã
ChromeãšFirefoxã§å©çšå¯èœãªVue devtoolsæ¡åŒµæ©èœãã€ã³ã¹ããŒã«ããããšããå§ãããŸãã éçºè
ããŒã«ã¯ãVueã§ã¢ããªã±ãŒã·ã§ã³ãåŠç¿ããã³éçºããéã«åªãããããã°æ
å ±ãæäŸããŸãã
Vueã䜿çšããããŒãžã§ã³
Vueã®ããŒãžã§ã³ã¯ãéåžžã®JavaScriptã䜿çšããŠèšè¿°ãããES6ããŒã«ãå¿é
ããã«ã³ã³ããŒãã³ãã®äŸã«éäžããå¿
èŠããªããªããŸãã
ãªã¢ã¯ãã£ããªã¢ãããŒãã§ããŒã¿ã衚瀺ããããšã§ãVueããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®è¡šç€ºããããŒã¿ãåé¢ããã®ã«ã©ã®ããã«åœ¹ç«ã€ããããããŸãã ãŸããjQueryã§ã®åŠçãReactãŸãã¯Vueãšæ¯èŒãããšãã«ãDOMå
ã移åããŠäžèªç¶ã«èŠããå€ãèšç®ããå¿
èŠããããŸããã
éå§
ãã³ãã¬ãŒããšJavaScriptãäœæããåã«ããã©ãŒã ãäœæããããã®ã¢ãããŒãã«ã€ããŠèª¬æããŸãããã ãã©ãŒã ã«é¢é£ä»ããããããŒã¿ã«ã€ããŠèããŠãåå è
ã®ã³ã¬ã¯ã·ã§ã³ïŒé
åïŒãš1ã€ã®èŠçŽ ã®äŸ¡æ Œãæ瀺ããŸãã
ãªãã©ã«ãªããžã§ã¯ãã¯æ¬¡ã®ããã«ãªããŸãã
var data = { attendees: [ { name: 'Example', email: 'user@example.com' } ], cost: 9.99, };
å¥ã®åå è
ãè¿œå ããŠããŒã¿ãæŽæ°ãããšãVueã¯ãªãã¹ã³ãããã®ããŒã¿å€æŽã«å¯Ÿå¿ããæºåãæŽããŸãã
data.attendees.push({ name: 'Example 2', email: 'user2@example.com' });
ããã念é ã«çœ®ããŠããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹çšã®ããã€ãã®å€§ãŸããªHTMLããŒã¯ã¢ãããšJavaScriptã¹ã±ã«ãã³ãæ§ç¯ããŸãããã
Vue HTMLãã³ãã¬ãŒã
jQueryããŒãžã§ã³ã§æ¢ã«èª¬æãããã¹ãŠã®æ©èœã䜿çšã§ããããã«ãJavaScriptãšHTMLãåŸã
ã«æ§ç¯ããŠãããŸãã
ãã®ã¬ã€ãã®Vueéšåã®æåã®HTMLããŒã¯ã¢ããã¯æ¬¡ã®ãšããã§ãã
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Vue Checkout UI</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css"> <style type="text/css"> body { margin: 3em } button { cursor: pointer; } .unit-price { margin-right: 2rem; color: #999; } </style> </head> <body> <div class="container" id="app"> <form> <div class="row justify-content-center" v-for="(attendee, index) in attendees" :key="index" > <div class="col-sm-3"> <div class="form-group"> <label class="sr-only">Name</label> <input class="form-control" aria-describedby="emailHelp" placeholder="Enter name" v-model="attendee.name" name="attendees[][name]" required > </div> </div> <div class="col-sm-3"> <div class="form-group"> <label class="sr-only">Email address</label> <input type="email" class="form-control" placeholder="Enter email" v-model="attendee.email" name="attendees[][email]" required > </div> </div> <div class="col-sm-2 text-left"> <button type="button" class="btn btn-light"> <span aria-hidden="true">Ã</span> Remove</button> </div> </div> <div class="row justify-content-center"> <div class="col-sm-6"></div> <div class="col-sm-2"> <button type="button" class="btn btn-secondary">Add Attendee</button> </div> </div> <hr> <div class="row justify-content-center"> <div class="col-sm-6"> <span class="unit-price">${{ cost }} ea.</span> </div> <div class="col-sm-2 text-left"> <button type="submit" class="btn btn-primary">Pay</button> </div> </div> <form> </div> <script src="https://unpkg.com/vue@2.4.4/dist/vue.js"></script> <script src="app.js"></script> </body> </html>
ããŒã¯ã¢ããã¯jQueryããŒãžã§ã³ã«éåžžã«äŒŒãŠããŸããã1ã€ã®èŠçŽ ã®äŸ¡æ Œã®å€æ°ã«æ°ä»ãããããããŸããã
<span class="unit-price">${{ cost }} ea.</span>
Vueã¯å®£èšåã¬ã³ããªã³ã°ã䜿çšããŠDOMã«ããŒã¿ãã¬ã³ããªã³ã°ããŸãã {{cost}}-ãå£ã²ããæ§æãšãã«èšå·$ã䜿çšããããŒã¿ãã€ã³ãã£ã³ã°ã
ã³ã¹ãããããã£ãæã€ããŒã¿ãªããžã§ã¯ããèŠããŠããŸããïŒ
var data = { cost: 9.99 };
é¢é£ããããŒã¿ãå€æŽããããšãmustacheã¿ã°ã¯data.costã«çœ®ãæããããŸãã
次ã«ãè¡v-for = "ïŒåºåžè
ãã€ã³ããã¯ã¹ïŒinåºåžè
"ã«æ³šæããŠãã ãããããã¯ãåºåžè
ããŒã¿é
åãééããååå è
ã®ãã©ãŒã å
¥åãã£ãŒã«ãã衚瀺ããã«ãŒãã§ãã
v-forå±æ§ã¯ãããã®åŒã®å€ãæŽæ°ãããšãã«ãDOMã«å€æŽãåå¿çã«é©çšããã ãã£ã¬ã¯ãã£ãã§ãã ãã®äŸã§ã¯ãdata.attendeesé
åãæŽæ°ããããšããã®ãã£ã¬ã¯ãã£ãã®çµæãšããŠDOMãæŽæ°ãããŸãã
ãã³ãã¬ãŒãã®è¡šç€ºãéå§ããå¿
èŠããããŸããããŒã¿ïŒç¶æ
ïŒãå€æŽãããšããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ããããã®å€æŽã«å¿çããŸãã ãã®çµæãã³ãŒãã¯ãã宣èšçã§èšè¿°ãããããªããŸãã
Vueã®åæå
HTMLããŒã¯ã¢ããã®äžéšã«ã¯ãapp.jsã¹ã¯ãªãããVueã³ãŒãã«æ¥ç¶ããã¿ã°ããããŸãã
ããŒãžäžã®Vueã€ã³ã¹ã¿ã³ã¹ãåæåããã«ã¯ãVueãDOMããŒãã«æ¥ç¶ããå¿
èŠããããŸãã ã³ã³ãã</ div>ãæäŸããŸãããã€ãŸãããã®DOMèŠçŽ å
ã®ããŒã¯ã¢ããã¯ãã¹ãŠVueã«é¢é£ä»ããããããŒã¿ã®å€æŽã«å¿çããŸãã
(function () { var app = new Vue({ el: '#app', data: { attendees: [{ name: '', email: '' }], cost: 9.99, }, }); })();
DOMèŠçŽ #appã«é¢é£ä»ããããæ°ããVueã€ã³ã¹ã¿ã³ã¹ãäœæããã¡ã€ã³ããŒã¿ãªããžã§ã¯ããå®çŸ©ããŸãã ããŒã¿ãªããžã§ã¯ãã«ã¯ã1ã€ã®èŠçŽ ãšåå è
ã®é
åã®ã³ã¹ããå«ãŸããŸãã 空çœã®åå è
ã1人远å ããããããã©ãŒã ã«ã¯ããã©ã«ãã§1ã»ããã®å
¥åãã£ãŒã«ãã衚瀺ãããŸãã
ãã¹ãŠã®ã¡ã³ããŒãåé€ããŠç©ºã®é
åã«ããå Žåãååãã¡ãŒã«ã¯è¡šç€ºãããŸããã
ãããã¯ãã¹ãŠãããã«åŒã³åºãããé¢æ°åŒïŒIIFEïŒã§ã©ãããããã°ããŒãã«ã¹ã³ãŒãããã€ã³ã¹ã¿ã³ã¹ãé€å€ãããŸãã
åèšäŸ¡æ Œã®èšç®
jQueryããŒãžã§ã³ã§ã¯ãã¡ã³ããŒã®åé€ãŸãã¯è¿œå ã€ãã³ãã䜿çšããŠæ°éãDOMãšåæããããšã«ãããåèšäŸ¡æ Œãèšç®ããŸããã Vueã§ã¯ããæ³åã®ãšãããããŒã¿ã䜿çšãããã¥ãŒã¯ãããã®å€æŽã«èªåçã«å¿çããŸãã
次ã®ãããªããšãã§ããŸãããDOMãªã¯ãšã¹ããããã¯ããã«åªããŠããŸãã
<button type="submit" class="btn btn-primary" > Pay ${{ cost * attendees.length }} </button>
ãã ãããã³ãã¬ãŒãã®ããžãã¯ãå€ããããšããã³ãã¬ãŒãã®è¡šçŸåãäœäžããä¿å®ãå°é£ã«ãªããŸãã 代ããã«ã èšç®ãããããããã£ã䜿çšã§ããŸã ã
(function () { var app = new Vue({ el: '#app', data: { attendees: [{ name: '', email: '' }], cost: 9.99, }, computed: { quantity: function () { return this.attendees.length; }, checkoutTotal: function () { return this.cost * this.quantity; } } }); })();
2ã€ã®èšç®ãããããããã£ãå®çŸ©ããŸããã æåã®ããããã£ã¯ãã±ããã®æ°ã§ãåå è
ã®é
åã®é·ãã«ãã£ãŠèšç®ãããŸãã
2çªç®ã®èšç®ããããã£ã¯checkoutTotalã§ãæåã®èšç®ããããã£ã䜿çšããŠèŠçŽ ã®æ°ã«ã³ã¹ããæããŸãã
ããã§ãèšç®ãããããããã£ã䜿çšããŠãã§ãã¯ãã¿ã³ãæŽæ°ã§ããŸãã çµæãšããŠèšç®ãããããããã£ã®ååãã©ã®ããã«èšè¿°ããããã«æ³šæããŠãã ããã
<button type="submit" class="btn btn-primary" > Pay ${{ checkoutTotal }} </button>
ãã©ãŠã¶ãæŽæ°ãããšããã¿ã³ã§èªåçã«èšç®ãããåèšéé¡ã衚瀺ãããŸãã
ã¡ã³ããŒãè¿œå ãããšãèšç®ãããããããã£ãèªåçã«æŽæ°ãããDOMã«è¡šç€ºãããŸãã
Vueã§ã¡ã³ããŒãè¿œå ãã
Vueã€ãã³ãã䜿çšããŠã¡ã³ããŒãè¿œå ããæ¹æ³ã確èªããæºåãã§ããŸããã
jQueryã§ã¯ãDOMã€ãã³ããã³ãã©ãŒã䜿çšããŸããã
$('.add-attendee').on('click', function () {});
Vueã§ã¯ããã³ãã¬ãŒãã§ã€ãã³ããããã¯ããŸãã ç§ã®æèŠã§ã¯ãããã«ããHTMLãèªã¿ããããªããŸãããªããªãããã®èŠçŽ ã«é¢é£ä»ããããŠããã€ãã³ããèŠã€ããããã®è¡šçŸåã®ããæ¹æ³ãããããã§ãã
v-onã䜿çšã§ããŸãïŒclick = "addAttendee"ïŒ
<button type="button" class="btn btn-secondary" v-on:click="attendees.push({ name: '', email: ''})" > Add Attendee </button>
ãŸãã¯ã click =â addAttendeeâã®ççž®çïŒ
<button type="button" class="btn btn-secondary" @click="attendees.push({ name: '', email: ''})" > Add Attendee </button>
ã©ã®ã¹ã¿ã€ã«ã䜿çšããŠãæ§ããŸãããã1ã€ã®æ¹æ³ã«åºå·ããããšããå§ãããŸãã ççž®ã¹ã¿ã€ã«ã奜ãã§ãã
ãã¿ã³ãã¯ãªãã¯ãããšãæ°ãããªããžã§ã¯ãããã³ãã¬ãŒãã®åºåžè
é
åã«é
眮ããŸãã å±æ§ã§JavaScriptãå®è¡ã§ããããšãç解ã§ããããã«ããã®ã¹ã¿ã€ã«ã玹ä»ãããã£ãã®ã§ãã
ã»ãšãã©ã®å Žåãã€ãã³ããã³ãã©ãŒã䜿çšããããšããå§ãããŸããååãšããŠãã€ãã³ãã«ã¯ããè€éãªããžãã¯ãé¢é£ä»ããããŠããããã§ãã
<button type="button" class="btn btn-secondary" @click="addAttendee" > Add Attendee </button>
Vueã¯ãã¡ã€ã³Vueãªããžã§ã¯ãïŒããã³ã³ã³ããŒãã³ãïŒã®ã¡ãœããã®ããããã£ãåãå
¥ããŸããããã«ãããã€ãã³ããã³ãã©ãŒã¡ãœãããå®çŸ©ã§ããŸãã
(function () { var app = new Vue({ el: '#app', data: { attendees: [{ name: '', email: '' }], cost: 9.99, }, computed: { quantity: function () { return this.attendees.length; }, checkoutTotal: function () { return this.cost * this.quantity; } }, methods: { addAttendee: function (event) { event.preventDefault(); this.attendees.push({ name: '', email: '', }); } } }); })();
ããã©ã«ãã®ã¢ã¯ã·ã§ã³ãé²æ¢ããæ°ãããªããžã§ã¯ããåºåžè
é
åã«é
眮ããŸãã åå è
ãè¿œå ãããšãæ°ããè¿œå ãããå
¥åãã£ãŒã«ãã衚瀺ãããcheckoutTotalã¯è¡æ°ã«å¯Ÿå¿ããŸãã
ãã³ãã©ãŒã¯ã€ãã³ããªããžã§ã¯ããåãåãããšã«æ³šæããŠãã ãããããã䜿çšããŠãããã©ã«ãã®ã¢ã¯ã·ã§ã³ãé²ãããšãã§ããŸãã ããã©ã«ãã®ã€ãã³ãã®ã¢ã¯ã·ã§ã³ãŸãã¯äŒæã®åæ¢ïŒevent.stopPropagationïŒïŒïŒãé²ãããã«ãVueã¯ããªãªãïŒãïŒãšãšãã«äœ¿çšãããã€ãã³ã修食åãæäŸããŸããå±æ§ã®äžéšãšããŠïŒ
<button type="button" class="btn btn-secondary" @click.prevent="addAttendee" > Add Attendee </button>
ã¡ãœããã¯ããŒã¿æåã§ãããVueã¯ã€ãã³ã修食åã䜿çšããŠDOMã€ãã³ããèªåçã«åŠçããŸãã
Vueããã¡ã³ããŒãåé€ãã
åå è
ã®åé€ã¯åå è
ã®è¿œå ã«äŒŒãŠããŸããããªããžã§ã¯ããé
åã«è¿œå ãã代ããã«ãå¥ã®ã€ãã³ããã³ãã©ãŒã®é
åã®ã€ã³ããã¯ã¹ã«åºã¥ããŠåé€ããå¿
èŠããããŸãã
<button type="button" class="btn btn-light" @click.prevent="removeAttendee(index)" > <span aria-hidden="true">Ã</span> Remove </button>
é
åã€ã³ããã¯ã¹ã䜿çšããŠãåé€ããç®çã®èšªåè
ãåç
§ããŸãã v-forã«ãŒãã§æãåºããšãã€ã³ããã¯ã¹ãå®çŸ©ããŸããã
<div class="row justify-content-center" v-for="(attendee, index) in attendees" :key="index" > </div>
Vueã€ã³ã¹ã¿ã³ã¹å
ã§ãã€ã³ããã¯ã¹ã«åºã¥ããŠé
åãã1ã€ã®èŠçŽ ãåé€ããã¹ãã©ã€ã¹ã䜿çšããremoveAttendeeã¡ãœãããå®çŸ©ããŸãã
methods: { removeAttendee: function (index) { this.attendees.splice(index, 1); },
removeAttendeeãã³ãã©ãŒã䜿çšãããšãã¡ã³ããŒãè¿œå ããã³åé€ã§ããŸãïŒ
ãŸããæ°äººã®åå è
ãè¿œå ããå Žåã«ã®ã¿ãåé€ããã¿ã³ã衚瀺ããŠãããžãã¹èŠä»¶ãæºãããããšèããŠããŸãã ãŠãŒã¶ãŒããã¹ãŠã®åå è
ãåé€ããããšã¯èš±å¯ããŸããã
çµã¿èŸŒã¿ã®v-showæ¡ä»¶ãã£ã¬ã¯ãã£ãã䜿çšããŠãããè¡ãããšãã§ããŸãã
<button type="button" class="btn btn-light" @click.prevent="removeAttendee(index)" v-show="quantity > 1" > <span aria-hidden="true">Ã</span> Remove </button>
èšç®ãããããããã£æ°éã䜿çšããŠãæ°éã1ãã倧ããå Žåã«åé€ãã¿ã³ã衚瀺ããŸããã
v-ifæ¡ä»¶ã§ãã¿ã³ãé衚瀺ã«ããããšãã§ããŸãã ãããã®ä»çµã¿ã®ãã¥ã¢ã³ã¹ãç解ããããã«ãããã¥ã¡ã³ããèªãããšããå§ãããŸãã
ãã®å Žåãv-showã䜿çšããŠãCSSã䜿çšããŠãã¿ã³ã衚瀺ããã³é衚瀺ã«ããŸãã v-ifã䜿çšããŠã³ãŒããå€æŽããDOMãèŠããšãVueãDOMããèŠçŽ ãåé€ããŠããããšãããããŸãã
Ready VueããŒãžã§ã³
Vueã®æçµããŒãžã§ã³ã¯æ¬¡ã®ãšããã§ãã
(function () { var app = new Vue({ el: '#app', data: { attendees: [{ name: '', email: '' }], cost: 9.99, }, computed: { quantity: function () { return this.attendees.length; }, checkoutTotal: function () { return this.cost * this.quantity; } }, methods: { removeAttendee: function (index) { this.attendees.splice(index, 1); }, addAttendee: function (event) { event.preventDefault(); this.attendees.push({ name: '', email: '', }); } } }); })();
! , DOM .
Vue , jQuery . , , jQuery . , , UI HTML.
次ã¯ïŒ
Vue, . Laravel, . , , Vue.
:
JQuery, React, Vue, . Vue , ( ).
, , .
â .