рдЕрдкрдиреЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╢реБрджреНрдз рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ Vue.js рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдирд╛

Vue.js рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЬрдм рдбреЗрдЯрд╛ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдХреЛ DOM рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдЖрдк рд╢реБрджреНрдз рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DOM рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реЗрдм рдкреЗрдЬ рдкрд░ рдХреБрдЫ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред


рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд░рд╛рдЬреНрдп рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ рдЖрд╕рд╛рди рдХрд╛рдо рдирд╣реАрдВ рд╣реИред рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓реЗрдЦрдХ, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдЖрдЬ рд╣рдо рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрдкрдиреЗ рд╢реЛрдз рдХреЗ рдХреБрдЫ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХ рдкреНрд░рдЧрддрд┐рд╢реАрд▓ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рд╣реБрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЦрд░реАрджрд╛рд░реА рдХреА рд╕реВрдЪреА рд╣реИ ред рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╢реБрджреНрдз рдЬреЗрдПрд╕ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ ( рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред рдпрд╣рд╛рдВ Vue.js рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдЗрд╕ рдврд╛рдВрдЪреЗ рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдПрдХ рдЙрддреНрддреАрд░реНрдг рдкрд░реАрдХреНрд╖рд╛ рдФрд░ рдЕрдВрдд рдореЗрдВ рдХреНрдпрд╛ рд╣реБрдЖ, рдЗрд╕рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рддреИрдпрд╛рд░ рдЖрд╡реЗрджрди

рдпрджрд┐ рдЖрдк рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢реБрджреНрдз рдЬреЗрдПрд╕ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓реЗрдЦрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ Vue рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рдирд╛


тЦНJavaScript


рдЖрд╡реЗрджрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдкрдиреА рдЦрд░реАрджрд╛рд░реА рд╕реВрдЪреА рдореЗрдВ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ index.html рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдорд╛рд░реНрдХрдЕрдк рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА 92-124 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рд╡рд╣рд╛рдБ рд╡рд╣ рд╣реИред

 <div> <div class="mdl-grid center-items"> <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">     <input class="mdl-textfield__input" type="text" id="new-item-name">     <label class="mdl-textfield__label" for="new-item-name">Item Name</label> </div> <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">     <input class="mdl-textfield__input" type="number" id="new-item-cost">     <label class="mdl-textfield__label" for="new-item-cost">Item Cost</label> </div> <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">     <input class="mdl-textfield__input" type="number" id="new-item-quantity">     <label class="mdl-textfield__label" for="new-item-quantity">Quantity</label> </div> </div> <div class="mdl-grid center-items"> <button id="add-item" class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored">     Add Item </button> </div> </div> 

рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рд╣реЗрдЬрдиреЗ рдХрд╛ рдХреЛрдб public/js/src/index.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИред 28 рд▓рд╛рдЗрди рдкрд░ saveItems() рдлрд╝рдВрдХреНрд╢рди рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд░рдиреЗ рдФрд░ рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рд╕реЗ рдорд╛рди рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди add-item рдмрдЯрди рдХреЗ click рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИред рдпрд╣рд╛рдБ рдкреНрд░рд╢реНрди рдореЗрдВ рдХреЛрдб рд╣реИред

 function saveNewitem() { let name = document.getElementById("new-item-name").value; let cost = document.getElementById("new-item-cost").value; let quantity = document.getElementById("new-item-quantity").value; let subTotal = cost * quantity; if (name && cost && quantity) {   hoodie.store.withIdPrefix("item").add({     name: name,     cost: cost,     quantity: quantity,     subTotal: subTotal   });   document.getElementById("new-item-name").value = "";   document.getElementById("new-item-cost").value = "";   document.getElementById("new-item-quantity").value = ""; } else {   let snackbarContainer = document.querySelector("#toast");   snackbarContainer.MaterialSnackbar.showSnackbar({     message: "All fields are required"   }); } } document.getElementById("add-item").addEventListener("click", saveNewitem); 

тЦНVue


Vue рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдкреГрд╖реНрда рд╕реЗ рд░реВрдкрд░реЗрдЦрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, index.html рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ app рд╕рд╛рде рдПрдХ <div> рддрддреНрд╡ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ body рдЯреИрдЧ рдХреЗ рдЕрдВрджрд░ рд╕реНрдерд┐рдд рд╕рднреА рдкреГрд╖реНрда рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм Vue рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдирдХрд╛рд░реА рджреЗрдиреА рд╣реЛрддреА рд╣реИ рдХрд┐ рдЙрд╕реЗ рдХрд┐рд╕ рдкреЗрдЬ рдХреЗ рдХрд┐рд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдореИрдиреЗрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд░реВрдкрд░реЗрдЦрд╛ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕реЗ рдЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ рдореМрдЬреВрдж рд╣рд░ рдЪреАрдЬ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ Vue рдореЗрдВ рдмрджрд▓рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХреБрдЫ Vue рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдХрдЕрдк рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред Vue рдХреЗ рдирд┐рд░реНрджреЗрд╢ v- рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рдХрд┐рдП рдЧрдП рд╡рд┐рд╢реЗрд╖ рдЧреБрдг рд╣реИрдВред рдпрд╣рд╛рдБ рдЕрджреНрдпрддрди рдорд╛рд░реНрдХрдЕрдк рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

 <form v-on:submit.prevent="onSubmit"> <div class="mdl-grid center-items">   <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">     <input class="mdl-textfield__input" type="text" id="new-item-name" v-model="name">     <label class="mdl-textfield__label" for="new-item-name">Item Name</label>   </div>   <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">     <input class="mdl-textfield__input" type="number" id="new-item-cost" v-model.number="cost">     <label class="mdl-textfield__label" for="new-item-cost">Item Cost</label>   </div>   <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">     <input class="mdl-textfield__input" type="number" id="new-item-quantity" v-model.number="quantity">     <label class="mdl-textfield__label" for="new-item-quantity">Quantity</label>   </div> </div> <div class="mdl-grid center-items">   <button id="add-item" class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored">     Add Item   </button> </div> </form> 

рдпрд╣рд╛рдБ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ v-on рдирд┐рд░реНрджреЗрд╢ рдбреЛрдо рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ, рдЗрд╕реЗ рдлреЙрд░реНрдо рдПрд▓реАрдореЗрдВрдЯ рдореЗрдВ submit рдЗрд╡реЗрдВрдЯ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ .prevent рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ v-on рдирд┐рд░реНрджреЗрд╢ рдХреЛ event.preventDefault() рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред рд╣рдордиреЗ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП v-model рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рддрддреНрд╡реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛ-рддрд░рдлрд╝рд╛ рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЪрдпрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдордиреЗ cost рдФрд░ quantity рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП .number рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдирдВрдмрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рднрд▓реЗ рд╣реА type=number рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рд▓реЗрдХрд┐рди рдорд╛рди рд╣рдореЗрд╢рд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрд╢реЛрдзрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред

рдЕрдЧрд▓рд╛, рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ, index-vue.js , рдЬрд┐рд╕рдореЗрдВ рд╣рдо index.js рдореЗрдВ рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рдХреЛрдб рд░рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди Vue рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдХреЛрдб рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдлрд╝реЙрд░реНрдо рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде Vue рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред

 const vm = new Vue({ el: "#app", data: {   name: "",   cost: "",   quantity: "" }, methods: {   onSubmit: function(event) {     if (this.name && this.cost && this.quantity) {       hoodie.store.withIdPrefix("item").add({         name: this.name,         cost: this.cost,         quantity: this.quantity,         subTotal: this.cost * this.quantity       });       this.name = "";       this.cost = "";       this.quantity = "";     } else {       const snackbarContainer = document.querySelector("#toast");       snackbarContainer.MaterialSnackbar.showSnackbar({         message: "All fields are required"       });     }   } } }); 

рдЗрд╕ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ Vue рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ Vue рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред el рд╕рдВрдкрддреНрддрд┐, DOM рддрддреНрд╡ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдврд╛рдВрдЪрд╛ рдмрддрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЗрд╕рдХреЗ "рдХреНрд╖реЗрддреНрд░" рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, Vue рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЗрд╕ рддрддреНрд╡ рдХреЗ рднреАрддрд░ рд╣реИ рдХрд┐ Vue рдлреНрд░реЗрдорд╡рд░реНрдХ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢реЛрдВ (рдФрд░ Vue рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреНрдп рд╕рдм рдХреБрдЫ) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧрд╛, рдФрд░, рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдФрд░ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдЧрд╛ред

data рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИред рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╡рд╕реНрддреБ рдореЗрдВ рд╕рднреА рдЧреБрдг, Vue рдХреЛ рдЖрд░рдореНрдн рдХрд░рддреЗ рд╕рдордп, рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рдЬрд╡рд╛рдмрджреЗрд╣реА рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рдПрдВрдЧреЗред рдпрд╣ рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпрд╛рдБ рд╣реИрдВ рдЬреЛ DOM рд╕реЗ рдЬреБрдбрд╝реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, name рд╕рдВрдкрддреНрддрд┐ v-model="name" рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ name рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИред рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рд╕рдВрдкрддреНрддрд┐ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдмреАрдЪ рджреЛ-рддрд░рдлрд╝рд╛ рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдХреБрдЫ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛ рдЗрд╕рдореЗрдВ рд╕реЗ рдХреБрдЫ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ), рддреЛ name рд╕рдВрдкрддреНрддрд┐ рдЕрджреНрдпрддрди рдХреА рдЬрд╛рддреА рд╣реИред рдирддреАрдЬрддрди, рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдХреА рд╕рд╛рдордЧреНрд░реА name рд╕рдВрдкрддреНрддрд┐ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИред

рдЗрд╕реА рддрд░рд╣, рдмрдВрдзрди рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

methods рдЧреБрдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ, onSubmit() рдлрд╝рдВрдХреНрд╢рди onSubmit() , рдЬреЛ submit() рдлреЙрд░реНрдо рдИрд╡реЗрдВрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

рдХрд┐рд╕реА рдкреГрд╖реНрда рдкрд░ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛


тЦНJavaScript


onSubmit рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╣реВрдбрд┐ рдореЗрдВ рдбреЗрдЯрд╛ рдмрдЪрд╛рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рд╕реНрдЯреЛрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдЖрдЗрдЯрдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдирд┐рдпрдорд┐рдд рдЬреЗрдПрд╕ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдЖрд╡реЗрджрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рд░реНрдХрдЕрдк рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 <div class="mdl-grid center-items"> <table id="item-table" class="mdl-data-table mdl-js-data-table mdl-shadow--2dp">   <thead>     <tr>       <th class="mdl-data-table__cell--non-numeric">Item Name</th>       <th class="mdl-data-table__cell--non-numeric">Cost</th>       <th class="mdl-data-table__cell--non-numeric">Quantity</th>       <th class="mdl-data-table__cell">Sub-total</th>       <th class="mdl-data-table__cell--non-numeric">         <button class="mdl-button mdl-js-button mdl-button--icon">           <i class="material-icons">delete</font></i>         </button>       </th>     </tr>   </thead>   <tbody>   </tbody> </table> </div> <div class="mdl-grid center-items"> <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">   <input class="mdl-textfield__input" type="number" id="total-cost" readonly value="0">   <label class="mdl-textfield__label" for="cost">Total Item Cost</label> </div> </div> <script id="item-row" type="text/template"> <tr id='{{row-id}}'>        <td class="mdl-data-table__cell--non-numeric">{{name}}</td>   <td class="mdl-data-table__cell--non-numeric">{{cost}}</td>   <td class="mdl-data-table__cell--non-numeric">{{quantity}}</td>   <td class="mdl-data-table__cell">{{subTotal}}</td>   <td class="mdl-data-table__cell--non-numeric">         <button class="mdl-button mdl-js-button mdl-button--icon mdl-button--colored"         onclick="pageEvents.deleteItem('{{item-id}}')">         <i class="material-icons">remove</font></i>         </button>   </td> </tr> </script> 

рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░реНрд╕ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдФрд░ рдбреЛрдо рдХреЗ рд╕рд╛рде рдЬреЛ рдХреБрдЫ рд╣реБрдЖ рдЙрд╕реЗ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдорд╛рдЗрдХреНрд░реЛ-рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХреА рдЧрдИ рд╣реИред

рдирд┐рдореНрди рдХреЛрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП рджрд┐рдЦрд╛рддрд╛ рд╣реИред

 function addItemToPage(item) { if (document.getElementById(item._id)) return; let template = document.querySelector("#item-row").innerHTML; template = template.replace("{{name}}", item.name); template = template.replace("{{cost}}", item.cost); template = template.replace("{{quantity}}", item.quantity); template = template.replace("{{subTotal}}", item.subTotal); template = template.replace("{{row-id}}", item._id); template = template.replace("{{item-id}}", item._id); document.getElementById("item-table").tBodies[0].innerHTML += template; let totalCost = Number.parseFloat(   document.getElementById("total-cost").value ); document.getElementById("total-cost").value = totalCost + item.subTotal; } hoodie.store.withIdPrefix("item").on("add", addItemToPage); 

рдЗрд╕ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ, DOM рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░реНрд╕ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдо DOM рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред рдлрд┐рд░ total-cost рд╕рдВрдХреЗрддрдХ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рд╕реВрдЪреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрд▓ рд░рд╛рд╢рд┐, рдЬрд┐рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

тЦНVue


Vue рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рддрддреНрд╡реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рд╡реЗ Vue v-for directive рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рддрддреНрд╡реЛрдВ рдХрд╛ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реА рдкреНрд░рдХрд╛рд░ рдЕрдм рдорд╛рд░реНрдХрдЕрдк рджрд┐рдЦрддрд╛ рд╣реИред

 <div class="mdl-grid center-items"> <table id="item-table" class="mdl-data-table mdl-js-data-table mdl-shadow--2dp">   <thead>     <tr>       <th class="mdl-data-table__cell--non-numeric">Item Name</th>       <th class="mdl-data-table__cell--non-numeric">Cost</th>       <th class="mdl-data-table__cell--non-numeric">Quantity</th>       <th class="mdl-data-table__cell">Sub-total</th>       <th class="mdl-data-table__cell--non-numeric">         <button class="mdl-button mdl-js-button mdl-button--icon">           <i class="material-icons">delete</font></i>         </button>       </th>     </tr>   </thead>   <tbody>     <tr v-for="item in items" :key="item._id">       <td class="mdl-data-table__cell--non-numeric">{{ item.name}}</td>       <td class="mdl-data-table__cell--non-numeric">{{ item.cost}}</td>       <td class="mdl-data-table__cell--non-numeric">{{ item.quantity}}</td>       <td class="mdl-data-table__cell">{{ item.subTotal}}</td>       <td class="mdl-data-table__cell--non-numeric">         <button @click="deleteRow(item._id)" class="mdl-button mdl-js-button mdl-button--icon mdl-button--colored">           <i class="material-icons">remove</font></i>         </button>       </td>     </tr>   </tbody> </table> </div> <div class="mdl-grid center-items"> <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label">   <!-- <input class="mdl-textfield__input" type="number" id="total-cost" readonly value="0">   <label class="mdl-textfield__label" for="cost">Total Item Cost</label> -->   <h4>Total Cost: {{ total }}</h4> </div> </div> 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдЗрддрдиреЗ рдмрдбрд╝реЗ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдпрд╣рд╛рдВ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдорд╛рдЗрдХреНрд░реЛ-рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рдирдХрд▓ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ Vue рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдФрд░ рдкреНрд░рдХреНрд╖реЗрдк рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред v-for рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдХрд╛ рдбреЗрдЯрд╛ items рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред Vue {{ item.name }} рдирд┐рд░реНрдорд╛рдг рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рддрдВрддреНрд░ рд╕реВрдХреНрд╖реНрдо-рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░реНрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИред рдкрд╛рда рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреГрд╖реНрда рдкрд░ рдХреБрд▓ рд░рд╛рд╢рд┐ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред

рдЕрдм рд╣рдо index-vue.js рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдВрдЧреЗ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

 const vm = new Vue({ el: "#app", data: {   name: "",   cost: "",   quantity: "",   items: [] }, computed: {   //     total: function() {     // `this`    vm     return this.items.reduce(       (accumulator, currentValue) => accumulator + currentValue.subTotal,       0     );   } }, methods: {   ..... } }); hoodie.store.withIdPrefix("item").on("add", item => vm.items.push(item)); 

Vue рджреНрд╡рд╛рд░рд╛ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╡рд░реНрдгрд┐рдд рддрдВрддреНрд░ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░, рдирд┐рдпрдорд┐рдд JS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рд╕реЗ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рдФрд░ рд╕рд░рд▓ рдирд┐рдХрд▓рд╛ред рдЗрд╕ рдХреЛрдб рдореЗрдВ, items рдбреЗрдЯрд╛ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░реНрд╡реЛрдХреНрдд v-for рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдХреЛрдИ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣реБрдбреА рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ vm.items.push(item) рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП vm.items.push(item) рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣, Vue рд░рд┐рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред рдХреБрд▓ рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, DOM рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ items рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ .reduce() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ items рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреА рд╣реИред рдЕрдм, Vue рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЬрдм рдпреЗ рдорд╛рди рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдХреЛрдб рдореЗрдВ DOM рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЫреЛрдЯреЗ рдХреЛрдб рдХреА рдорджрдж рд╕реЗ, рд╣рдордиреЗ рдЙрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рдирд┐рдпрдорд┐рдд рдЬреЗрдПрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА (рд╢рд╛рдпрдж, рдЕрдЧрд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рд╛рдзрд╛рд░рдг рдЬреЗрдПрд╕ рдХреЗ рдмрдЬрд╛рдп jQuery рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдмрд┐рд▓реНрд▓реА рднреА рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░ рдЖ рдЬрд╛рдПрдЧреА; Vue рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдЬреЛ рдорд┐рд▓рд╛ рд╣реИ)ред

рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдЗрдЯрдо рд╕рд╣реЗрдЬрдирд╛


тЦНJavaScript


рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрдиреНрдп рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдЬреЛрдбрд╝ рд╕рдХреЗрдВред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ Save List рдмрдЯрди рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╣реВрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рдПрдХ рдирдП рд╕реЗрдЯ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдирд┐рдпрдорд┐рдд рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рдВрдХреНрд╢рди onClick рдмрдЯрди onClick рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИред рдпрд╣рд╛рдБ рдорд╛рд░реНрдХрдЕрдк рд╣реИред

 //index.html <div class="mdl-grid center-items"> <button class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored" onclick="pageEvents.saveList()">   Save List </button> </div> 

рдпрд╣рд╛рдБ рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рд╣реИред

 //index.js function saveList() { let cost = 0; hoodie.store   .withIdPrefix("item")   .findAll()   .then(function(items) {     for (var item of items) {       cost += item.subTotal;     }     //      hoodie.store.withIdPrefix("list").add({       cost: cost,       items: items     });     //      hoodie.store       .withIdPrefix("item")       .remove(items)       .then(function() {         //          document.getElementById("item-table").tBodies[0].innerHTML = "";         //          var snackbarContainer = document.querySelector("#toast");         snackbarContainer.MaterialSnackbar.showSnackbar({           message: "List saved succesfully"         });       })       .catch(function(error) {         //             var snackbarContainer = document.querySelector("#toast");         snackbarContainer.MaterialSnackbar.showSnackbar({           message: error.message         });       });   }); } window.pageEvents = { deleteItem: deleteItem, saveList: saveList .... }; 

тЦНVue


Vue рдореЗрдВ рдЬрд╛рдиреЗ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рд╣рдореЗрдВ рдмрдЯрди рдХреЛ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдИрд╡реЗрдВрдЯ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ Vue рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА methods рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ рдореЗрдВ рд╣реИ рдЬрдм рдЗрд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ рдЕрдм рдорд╛рд░реНрдХрдЕрдк рджрд┐рдЦреЗрдЧрд╛ред

 <div class="mdl-grid center-items"> <button @click="saveList" class="mdl-button mdl-js-button mdl-button--raised mdl-button--colored">   Save List </button> </div> 

@click="saveList" v-on:click="saveList" рд▓рд┐рдП рдПрдХ рдЖрд╢реБрд▓рд┐рдкрд┐ рд╣реИ v-on:click="saveList" ред рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ DOM рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣реА saveList рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрджреНрдз рдЬреЗрдПрд╕ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЛ рд╡реАрдпреВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ methods рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░


тЦНJavaScript


рдЕрдм рдЬрдм рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЙрди рд╕рд╛рдорд╛рдиреЛрдВ рдХреЗ рдХреБрд▓ рдореВрд▓реНрдп рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╕рд╣реЗрдЬреА рдЧрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рджреВрд╕рд░реЗ рдкреГрд╖реНрда рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧреА, рдпрд╣ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдХреНрд╖рд░ рдХреА рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред


рдкрд╣рд▓реЗ рдирд┐рд░реНрдорд┐рдд рдЙрддреНрдкрд╛рдж рд╕реВрдЪрд┐рдпреЛрдВ рдкрд░ рдбреЗрдЯрд╛

рдЗрд╕ рдкреГрд╖реНрда рдХрд╛ рдорд╛рд░реНрдХрдЕрдк public/history.html рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ, рдЗрд╕реА рдЬреЗрдПрд╕ рдХреЛрдб рдХреЛ public/js/src/history.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИред рдЗрд╕ рдкреГрд╖реНрда рдФрд░ index.html рдореЗрдВ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рдпрд╣ рдПрдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░ рд╣реИ рдЬреЛ рдЦрд┐рдбрд╝рдХреА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕реНрдерд┐рдд рд╣реИред рдЗрд╕ рдкреИрдирд▓ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдВрдХ, Login рдФрд░ Register рд▓рд┐рдВрдХ рд╣реИрдВ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╡рд╛рдж рд░реВрдкреЛрдВ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рддреЗ рд╣реИрдВред рд▓реЙрдЧ рдЖрдЙрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ Signout рдмрдЯрди рднреА рд╣реИред
рд╕рд╛рдзрд╛рд░рдг рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЖрдкрдХреЛ рджреЛрдиреЛрдВ рдкреГрд╖реНрдареЛрдВ рдкрд░ рд╕рдорд╛рди рдорд╛рд░реНрдХрдЕрдк рдХреА рдирдХрд▓ рдХрд░рдиреА рд╣реЛрдЧреАред рдпрд╣ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░ HTML рдХреЛрдб рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

 <header class="mdl-layout__header">   <div class="mdl-layout__header-row">   <!-- Title -->   <span class="mdl-layout-title">Shopping List</span>   <!-- Add spacer, to align navigation to the right -->   <div class="mdl-layout-spacer"></div>   <!-- Navigation. We hide it in small screens. -->   <nav class="mdl-navigation mdl-layout--large-screen-only">       <a class="mdl-navigation__link" href="index.html">Home</a>       <a class="mdl-navigation__link" href="history.html">History</a>       <a onclick="pageEvents.showLogin()" style="cursor: pointer" class="mdl-navigation__link login">Login</a>       <a onclick="pageEvents.showRegister()" style="cursor: pointer" class="mdl-navigation__link register">Register</a>       <a onclick="pageEvents.signout()" style="cursor: pointer" class="mdl-navigation__link logout">Logout</a>   </nav>   </div> </header> <div class="mdl-layout__drawer">   <span class="mdl-layout-title">Shopping List</span>   <nav class="mdl-navigation">   <a class="mdl-navigation__link" href="index.html">Home</a>   <a class="mdl-navigation__link" href="history.html">History</a>   <a onclick="pageEvents.showLogin()" style="cursor: pointer" class="mdl-navigation__link login">Login</a>   <a onclick="pageEvents.showRegister()" style="cursor: pointer" class="mdl-navigation__link register">Register</a>   <a onclick="pageEvents.signout()" style="cursor: pointer" class="mdl-navigation__link logout">Logout</a>   </nav> </div> 

рдЗрд╕ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЬрдм рдЖрдк Login , Register рдФрд░ Logout рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ index.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред

 import * as shared from "shared.js"; .... shared.updateDOMLoginStatus(); window.pageEvents = { showLogin: shared.showLoginDialog, showRegister: shared.showRegisterDialog, signout: shared.signOut }; 

рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХрд╛рд░реНрдп shared.js ред shared.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред

 //   let loginDialog = document.querySelector("#login-dialog"); dialogPolyfill.registerDialog(loginDialog); let registerDialog = document.querySelector("#register-dialog"); dialogPolyfill.registerDialog(registerDialog); let showLoginDialog = function() { loginDialog.showModal(); }; let showRegisterDialog = function() { registerDialog.showModal(); }; let showAnonymous = function() { document.getElementsByClassName("login")[0].style.display = "inline"; document.getElementsByClassName("login")[1].style.display = "inline"; document.getElementsByClassName("register")[0].style.display = "inline"; document.getElementsByClassName("register")[1].style.display = "inline"; document.getElementsByClassName("logout")[0].style.display = "none"; document.getElementsByClassName("logout")[1].style.display = "none"; }; let showLoggedIn = function() { document.getElementsByClassName("login")[0].style.display = "none"; document.getElementsByClassName("login")[1].style.display = "none"; document.getElementsByClassName("register")[0].style.display = "none"; document.getElementsByClassName("register")[1].style.display = "none"; document.getElementsByClassName("logout")[0].style.display = "inline"; document.getElementsByClassName("logout")[1].style.display = "inline"; }; let updateDOMLoginStatus = () => { hoodie.account.get("session").then(function(session) {   if (!session) {     //          showAnonymous();   } else if (session.invalid) {     //   ,          showAnonymous();   } else {     //         showLoggedIn();   } }); }; let signOut = function() { hoodie.account   .signOut()   .then(function() {     showAnonymous();     let snackbarContainer = document.querySelector("#toast");     snackbarContainer.MaterialSnackbar.showSnackbar({       message: "You logged out"     });     location.href = location.origin;   })   .catch(function() {     let snackbarContainer = document.querySelector("#toast");     snackbarContainer.MaterialSnackbar.showSnackbar({       message: "Could not logout"     });   }); }; export { signOut, showRegisterDialog, showLoginDialog, updateDOMLoginStatus }; 

рдпрд╣ рдХреЛрдб рдЙрди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ index.js рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред showLoginDialog() рдФрд░ showRegisterDialog() рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд╢рдГ рдореЙрдбрд▓ рдбрд╛рдпрд▓реЙрдЧ рдмреЙрдХреНрд╕ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред showAnonymous() рдлрд╝рдВрдХреНрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓реЙрдЧрдСрди рдХрд░рдиреЗ рдФрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ showAnonymous() рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ Logout рд▓рд┐рдВрдХ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ Register рдФрд░ Login рд▓рд┐рдВрдХ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгрд┐рдд рд╣реИ рдФрд░ рдЙрдкрдпреБрдХреНрдд рд▓рд┐рдВрдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рддреЛ updateDOMLoginStatus() рдлрд╝рдВрдХреНрд╢рди рдЬрд╛рдБрдЪрддрд╛ рд╣реИред рдкреГрд╖реНрда рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреГрд╖реНрдареЛрдВ рдкрд░ рдПрдХ рд╣реА рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдбреЛрдо рддрддреНрд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдкреИрдирд▓ рдкрд░ рд▓рд┐рдВрдХ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдФрд░ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдПрд╕рдПрд╕ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЖрдЗрдП Vue рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░ рдХреЛ рджреЗрдЦреЗрдВред

тЦНVue


рдХрдИ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдкреГрд╖реНрдареЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░ред рдРрд╕реА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдШрдЯрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред Vue рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдПрдХ рдШрдЯрдХ рдЗрдВрдЬрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реНрд╡рд░ рдШрдЯрдХ рд╕реНрд╡-рдирд┐рд╣рд┐рдд рдФрд░ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рд╣реИрдВред

Vue рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛, рд╣рдо рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓, shared-vue.js ред Vue, . .

 Vue.component("navigation", { props: ["isLoggedIn", "toggleLoggedIn"], template: `<div>             <header class="mdl-layout__header">       <div class="mdl-layout__header-row">         <!-- Title -->         <span class="mdl-layout-title">Shopping List</span>         <!-- Add spacer, to align navigation to the right -->         <div class="mdl-layout-spacer"></div>         <!-- Navigation. We hide it in small screens. -->         <nav class="mdl-navigation mdl-layout--large-screen-only">           <a class="mdl-navigation__link" href="index.html">Home</a>           <a class="mdl-navigation__link" href="history.html">History</a>           <a v-show="!isLoggedIn" @click="showLogin" style="cursor: pointer" class="mdl-navigation__link login">Login</a>           <a v-show="!isLoggedIn" @click="showRegister" style="cursor: pointer" class="mdl-navigation__link register">Register</a>           <a v-show="isLoggedIn" @click="logout" style="cursor: pointer" class="mdl-navigation__link logout">Logout</a>         </nav>       </div>     </header>     <div class="mdl-layout__drawer">       <span class="mdl-layout-title">Shopping List</span>       <nav class="mdl-navigation">         <a class="mdl-navigation__link" href="index.html">Home</a>         <a class="mdl-navigation__link" href="history.html">History</a>         <a v-show="!isLoggedIn" @click="showLogin" style="cursor: pointer" class="mdl-navigation__link login">Login</a>         <a v-show="!isLoggedIn" @click="showRegister" style="cursor: pointer" class="mdl-navigation__link register">Register</a>         <a v-show="isLoggedIn" @click="logout" style="cursor: pointer" class="mdl-navigation__link logout">Logout</a>       </nav>     </div>           </div>`, methods: {   showLogin: function() {     const loginDialog = document.querySelector("#login-dialog");     dialogPolyfill.registerDialog(loginDialog);     loginDialog.showModal();   },   showRegister: function() {     const registerDialog = document.querySelector("#register-dialog");     dialogPolyfill.registerDialog(registerDialog);     registerDialog.showModal();   },   logout: function() {     hoodie.account       .signOut()       .then(() => {         this.toggleLoggedIn();       })       .catch(error => {         alert("Could not logout");       });   } } }); 

Vue, navigation , , , Vue. тАФ props . props тАФ . , , , props . isLoggedIn , .

, template , , . , , JS, , Vue тАФ v-show @click . v-show . Logout , isLoggedIn true , false тАФ Login Register . , Vue v-if v-else . . @click тАФ v-on:click . showLogin , showRegister logout .

methods . logout , , this.toggleLoggedIn() , props . , props , , isLoggedin , . , Vue DOM.
index.html . , 59-84. .

 <navigation v-bind:is-logged-in="isLoggedIn" v-bind:toggle-logged-in="toggleLoggedIn"></navigation> 

JS- isLoggedIn toggleLoggedIn , , props , , kebab-case. v-bind . isLoggedIn . : v-bind , .

 <navigation :is-logged-in="isLoggedIn" :toggle-logged-in="toggleLoggedIn"></navigation> 

isLoggedIn , toggleLoggedIn тАФ , Vue index-vue.js . .

 const vm = new Vue({ el: "#app", data: {   name: "",   cost: "",   quantity: "",   items: [],   isLoggedIn: false }, computed: {   .....//   }, methods: {   toggleLoggedIn: function() {     this.isLoggedIn = !this.isLoggedIn;   },   ......//   } }); .....//   hoodie.account.get("session").then(function(session) { if (!session) {   //       vm.isLoggedIn = false; } else if (session.invalid) {   vm.isLoggedIn = false; } else {   //       vm.isLoggedIn = true; } }); 

Vue , , , , Vue. , Vue DOM , .


тЦНJavaScript


Login Register , . , , , . 171-244 index.html 100-158 history.html .

 <dialog id="login-dialog" class="mdl-dialog"> <h4 class="mdl-dialog__title">Login</h4> <div class="mdl-dialog__content">   <div class="mdl-grid center-items">     <!-- Simple Textfield -->     <div class="mdl-textfield mdl-js-textfield">       <input class="mdl-textfield__input" type="text" id="login-username">       <label class="mdl-textfield__label" for="login-username">Username</label>     </div>   </div>   <div class="mdl-grid center-items">     <!-- Simple Textfield -->     <div class="mdl-textfield mdl-js-textfield">       <input class="mdl-textfield__input" type="password" id="login-password">       <label class="mdl-textfield__label" for="login-password">Password</label>     </div>   </div>   <div class="mdl-grid center-items">     <!-- Simple Textfield -->     <div class="mdl-textfield mdl-js-textfield">       <span id="login-error"></span>     </div>   </div> </div> <div class="mdl-dialog__actions">   <button onclick="pageEvents.closeLogin()" type="button" class="mdl-button close">Cancel</button>   <button onclick="pageEvents.login()" type="button" class="mdl-button">Login</button> </div> </dialog> <dialog id="register-dialog" class="mdl-dialog"> <h4 class="mdl-dialog__title">Login</h4> <div class="mdl-dialog__content">   <div class="mdl-grid center-items">     <!-- Simple Textfield -->     <div class="mdl-textfield mdl-js-textfield">       <input class="mdl-textfield__input" type="text" id="register-username">       <label class="mdl-textfield__label" for="register-username">Username</label>     </div>   </div>   <div class="mdl-grid center-items">     <!-- Simple Textfield -->     <div class="mdl-textfield mdl-js-textfield">       <input class="mdl-textfield__input" type="password" id="register-password">       <label class="mdl-textfield__label" for="register-password">Password</label>     </div>   </div>   <div class="mdl-grid center-items">     <!-- Simple Textfield -->     <div class="mdl-textfield mdl-js-textfield">       <span id="register-error"></span>     </div>   </div> </div> <div class="mdl-dialog__actions">   <button onclick="pageEvents.closeRegister()" type="button" class="mdl-button close">Cancel</button>   <button onclick="pageEvents.register()" type="button" class="mdl-button">Register</button> </div> </dialog> 

, , shared.js index.js .

 //shared.js //   let loginDialog = document.querySelector("#login-dialog"); dialogPolyfill.registerDialog(loginDialog); let registerDialog = document.querySelector("#register-dialog"); dialogPolyfill.registerDialog(registerDialog); let closeLoginDialog = function() { loginDialog.close(); }; let closeRegisterDialog = function() { registerDialog.close(); }; let showAnonymous = function() { ... }; let showLoggedIn = function() { .... }; let signOut = function() { .... }; let updateDOMLoginStatus = () => { .... }; let login = function() { let username = document.querySelector("#login-username").value; let password = document.querySelector("#login-password").value; hoodie.account   .signIn({     username: username,     password: password   })   .then(function() {     showLoggedIn();     closeLoginDialog();     let snackbarContainer = document.querySelector("#toast");     snackbarContainer.MaterialSnackbar.showSnackbar({       message: "You logged in"     });   })   .catch(function(error) {     console.log(error);     document.querySelector("#login-error").innerHTML = error.message;   }); }; let register = function() { let username = document.querySelector("#register-username").value; let password = document.querySelector("#register-password").value; let options = { username: username, password: password }; hoodie.account   .signUp(options)   .then(function(account) {     return hoodie.account.signIn(options);   })   .then(account => {     showLoggedIn();     closeRegisterDialog();     return account;   })   .catch(function(error) {     console.log(error);     document.querySelector("#register-error").innerHTML = error.message;   }); }; export { register, login, closeRegisterDialog, closeLoginDialog, ... }; 

index.js.

 //index.js window.pageEvents = { closeLogin: shared.closeLoginDialog, showLogin: shared.showLoginDialog, closeRegister: shared.closeRegisterDialog, showRegister: shared.showRegisterDialog, login: shared.login, register: shared.register, signout: shared.signOut }; 

тЦНVue


Vue . , .

 Vue.component("login-dialog", { data: function() {   return {     username: "",     password: ""   }; }, props: ["toggleLoggedIn"], template: `<dialog id="login-dialog" class="mdl-dialog">     <h4 class="mdl-dialog__title">Login</h4>     <div class="mdl-dialog__content">       <div class="mdl-grid center-items">         <!-- Simple Textfield -->         <div class="mdl-textfield mdl-js-textfield">           <input v-model="username" class="mdl-textfield__input" type="text" id="login-username">           <label class="mdl-textfield__label" for="login-username">Username</label>         </div>       </div>       <div class="mdl-grid center-items">         <!-- Simple Textfield -->         <div class="mdl-textfield mdl-js-textfield">           <input v-model="password" class="mdl-textfield__input" type="password" id="login-password">           <label class="mdl-textfield__label" for="login-password">Password</label>         </div>       </div>       <div class="mdl-grid center-items">         <!-- Simple Textfield -->         <div class="mdl-textfield mdl-js-textfield">           <span id="login-error"></span>         </div>       </div>     </div>     <div class="mdl-dialog__actions">       <button @click="closeLogin" type="button" class="mdl-button close">Cancel</button>       <button @click="login" type="button" class="mdl-button">Login</button>     </div>   </dialog>`, methods: {   closeLogin: function() {     const loginDialog = document.querySelector("#login-dialog");     dialogPolyfill.registerDialog(loginDialog);     loginDialog.close();   },   login: function(event) {     hoodie.account       .signIn({         username: this.username,         password: this.password       })       .then(() => {         this.toggleLoggedIn();         this.closeLogin();       })       .catch(error => {         console.log(error);         document.querySelector("#login-error").innerHTML = "Error loggin in";       });   } } }); 

data , props , template methods , Vue.component() .

, , Vue .

 //index.html <login-dialog v-bind:toggle-logged-in="toggleLoggedIn"></login-dialog> 

.

, , Vue. , , . , - Push API .

рдкрд░рд┐рдгрд╛рдо


-, JS, Vue.js. HTML, CSS JavaScript (jQuery), Vue . ES6 , .

Vue , , . , , , Vue. , , Vue .

, JS. тАФ , Vue.

рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! - ?

Source: https://habr.com/ru/post/hi413311/


All Articles