Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʹÓÃwebpack+vue.js¹¹½¨Ç°¶Ë¹¤³Ì»¯
 
×÷ÕߣºÎÒÊÇéªéª
  1454  次浏览      27
  2020-5-9
 
±à¼­ÍƼö:
±¾ÆªÖ÷Òª½éÉÜÈý¿é֪ʶµã£º node.js ,vue.js,webpackǰ¶Ë¹¤³Ì»¯ £¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚcsdn,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­ÍƼö¡£

node.js»ù±¾ÈëÃÅ

node.js½éÉÜ

node.js¿ÉÒÔÈÃjavascript³ÌÐòÔÚºó¶ËÔËÐÐÆðÀ´¡£ÎÒÃÇ֮ǰËùÊìÖªµÄjavascript¶¼ÊÇÔËÐÐÔÚǰ¶Ëä¯ÀÀÆ÷£¬ÎÒÃDZàдºÃÁËjavascript´úÂëºó£¬ÓÉä¯ÀÀÆ÷½âÊÍÖ´ÐС£¶ønode.js£¬¿ÉÒÔÈÃÎÒÃDZàдjavascript£¬È»ºóÔÚºó¶ËÔËÐÐÆðÀ´¡£ÏÖÔÚµÄjavascriptºÍjava¡¢pythonÒ»Ñù£¬¿ÉÒÔ²Ù×÷I/O¡¢²Ù×÷Êý¾Ý¿â¡¢»òÕ߯äËû¸÷Àà²Ù×÷ϵͳ×ÊÔ´¡£

ÉÏÃæÕâÕÅͼ£¬ºÍÏÂÃæµÄÕâÕÅͼºÜÏñ¡£¿ÉÒÔÈÏΪ£¬node.jsÊÇjavascriptµÄÒ»ÖÖ¿çÆ½Ì¨ÔËÐÐÔÚÖ÷»úµÄʵÏÖ¡£

»·¾³´î½¨

ÏÂÔØnode.js £¨ÔËÐл·¾³£©

https://nodejs.org/en/

ÏÂÔØVisual Studio Code£¨¿ª·¢»·¾³£©

https://code.visualstudio.com/

npm½éÉÜ

д¹ýJavaµÄͬѧӦ¸Ã¶¼ÖªµÀ£¬ÎÒÃÇÒª±àд³ÌÐòÍùÍù¶¼ÐèÒªµ¼ÈëºÜ¶àÆäËû¶îÍâµÄJAR°ü£¨¹Ù·½µÄJavaSE°üĬÈÏÌṩÁË£©¡£ÔçÆÚÔÚMaven³öÏÖ֮ǰ£¬ÎÒÃǶ¼ÊÇÐèÒªÊÖ¶¯È¥ÏÂÔØ¸÷ÖÖ¿ò¼ÜµÄJAR°ü¡£×Ô´ÓÓÐÁËMavenÖ®ºó£¬ÎÒÃDz»ÔÙÐèÒªÊÖ¶¯ÏÂÔØÁË£¬Ö±½ÓÔÚÒ»¸öPOM.XMLÎļþÖÐÒýÈëÐèÒªµÄÒÀÀµ¼´¿É¡£ÔÚnodeÖУ¬ÔËÐÐÒ»¸önode³ÌÐòÒ²»áÒÀÀµÓÚÆäËûµÄһЩģ¿é¡£µ±È»nodeÒ²»á×Ô´øÒ»Ð©»ù±¾Ä£¿é¡£Äǵ±ÎÒÃÇÐèҪʹÓÃÕâЩģ¿éµÄʱºò£¬ÎÒÃÇÐèÒª´ÓÍøÂçÉÏÏÂÔØ¡£Õâ¸öÈ¥ÍøÉÏÏÂÔØ·Ç³£Âé·³¡£node¹Ù·½ÌṩÁËÒ»¸ö¹ÜÀí¹¤¾ßnpm£¬Õâ¸ö¹¤¾ß¿ÉÒÔ¸ù¾ÝÐèÒª×Ô¶¯´Ó·þÎñÆ÷ÏÂÔØ¸÷ÖÖ°ü¡£Õâ¾ÍʡȥÁË£¬ÎÒÃÇ×Ô¼ºÈ¥ÍøÉÏÏÂÔØ°üµÄ¹ý³Ì¡£

npmÌÔ±¦¾µÏñ

¹Ù·½µÄnpmÔÚ¹úÄÚËÙ¶ÈÊDZȽÏÂýµÄ£¬¿ÉÒÔʹÓÃÌÔ±¦µÄ¾µÏñ

npm install -g cnpm --registry=https://registry.npm.taobao.org

°²×°Íê³Éºó£¬¾Í¿ÉÒÔʹÓÃcnpm´ÓÌÔ±¦¾µÏñÀ´ÏÂÔØ¡¢°²×°node°ü

ʹÓÃcnpm°²×°°ü

cnpm install <°üµÄÃû³Æ>

°üµÄÃû³Æ¿ÉÒÔÈ¥https://npm.taobao.org/ÉÏËÑË÷

node.jsÄ£¿é»¯³ÌÐò½á¹¹

ÿһ¸öjsÎļþ¾ÍÊÇÒ»¸öÄ£¿é£¨jsonµÈÆäʵҲ¿ÉÒÔ×÷Ϊһ¸öÄ£¿é£©£¬¶ÔÓ¦µÄ¾ÍÊÇÒ»¸ömodule¶ÔÏó¡£ÏÂÃæÕâÒ»¶Î³ÌÐò£¬±íʾ´ÓÍⲿÒýÈëÒ»¸öÄ£¿é£¬È»ºóÖ´ÐÐÄ£¿éÖеĺ¯Êý¡£

var fs = require("fs"); // ÒýÈëfsÄ£¿é
var data = fs.readFileSync('input.txt'); // µ÷ÓÃfsÄ£¿éÖеÄreadFileSync·½·¨
console.log(data.toString());

µÚÒ»ÐеÄ, required±íʾÒýÈëÒ»¸ö°ü£¬·µ»ØµÄ¾ÍÊÇmodule¶ÔÏó¡£Õâ¸öfs°ü£¬ÊÇnode×Ô´øµÄ°ü£¬ÒýÈëÒ»¸ö°üºó¾Í¿ÉÒÔµ÷ÓÃÕâ¸ö°üÏµķ½·¨¡£µ«ÊǰüÖеķ½·¨²»ÊǶ¼¿ÉÒÔ±»µ÷Óõģ¬Ö»ÓÐÀàËÆ£º

exports.world = function() {
console.log('Hello World');
}

ÕâÑùµÄ´úÂ룬²ÅÄܱ»µ÷Ó᣸ü¼òµ¥À´Ëµ£¬ÔÚ°üÖж¨ÒåµÄº¯Êý¶¼ÊǶÔÍâ²»¿É¼ûµÄ£¬ÒªÏë±»Íⲿµ÷Óã¬ÐèҪʹÓÃexportsÀ´¶¨Ò庯Êý¡£

Õâ¸örequireº¯ÊýÓеãÀàËÆÓÚCÓïÑÔÖеÄ#include¡£ËüÊ×ÏÈ»á´ÓÎļþcache»º´æÖвéÕÒ´«ÈëµÄÄ£¿éÃû£¬Èç¹ûûÓÐÕÒµ½ÔÙ²éÕÒÔ­ÉúÄ£¿é£¬×îºó²éÕÒÎļþÖмÓÔØ¡£

node.jsÖØÒªÄ£¿é(API)½éÉÜ

node.jsÈ«¾Ö¶ÔÏó

node.jsÔ­ÉúÄ£¿é

ʵÏÖÒ»¸öÓû§¹ÜÀíÄ£¿é

´´½¨ÏîÄ¿

½¨Á¢Ò»¸ö¿ÕµÄÎļþ¼ÐÓÃÓÚ±£´æ¸ÃÏîÄ¿

½øÈëÃüÁîÌáʾ·û£¬Ê¹ÓÃnpm init³õʼ»¯ÏîÄ¿£¬½áÊøºó»á×Ô¶¯Éú³ÉÒ»¸öpackage.jsonÎļþ£¬Õâ¸öÎļþÖаüº¬ÁËÏîÄ¿µÄËùÓÐÒÀÀµ°ü£¬¿ÉÒÔ°ÑÕâ¸öpackage.jsonÎļþÀí½âΪÏîÄ¿Îļþ

´´½¨¿Í»§ServiceÄ£¿é

/**
* ¿Í»§Service
*/
exports.CustomerService = function() {
this.customers = [];

// Ìí¼Ó¿Í»§
this.add = function(cstm) {
this.customers.push(cstm);
}

// ¸ù¾Ý¿Í»§Ãû×ÖÒÆ³ý
this.remove = function(name) {
for(var i = 0; i < this.customers.length; ++i) {
if(this.customers[i].name === name) {
this.customers.splice(i, 1);
break;
}
}
}

// »ñÈ¡ËùÓпͻ§
this.findAll = function() {
return this.customers;
}
}

´´½¨Èë¿ÚÄ£¿éindex.js

var customerService = require('./customerService');
var cm = new customerService.CustomerService();
cm.add({name: 'СÇÇ', age: 20, sex: 'Å®'});
cm.add({name: '¶þÇÇ', age: 21, sex: 'Å®'});
cm.add({name: '´óÇÇ', age: 22, sex: 'Å®'});
// ²éѯËùÓпͻ§
var cstms = cm.findAll();
console.log("---");
console.log(cstms);
// ɾ³ý¿Í»§
cm.remove("СÇÇ");
console.log("---");
console.log(cm.findAll())

Ö´ÐÐnode index.js

PS H:\code\nodejs\02> node .\index.js
---
[ { name: 'СÇÇ', age: 20, sex: 'Å®' },
{ name: '¶þÇÇ', age: 21, sex: 'Å®' },
{ name: '´óÇÇ', age: 22, sex: 'Å®' } ]
---
[ { name: '¶þÇÇ', age: 21, sex: 'Å®' },
{ name: '´óÇÇ', age: 22, sex: 'Å®' } ]

vue.js»ù±¾ÈëÃÅ

½éÉÜ

VueÊÇÒ»Ì×ǰ¶Ë¿ò¼Ü¡£ËüʵÏÖÁËǰ¶ËÒ³ÃæÊÓͼ£¨HTML/CSS£©ºÍÄ£ÐÍÊý¾ÝµÄ·ÖÀ룬¶øÇÒËüÌṩÁË¿ìËÙ¼òµ¥¹¹½¨×é¼þµÄ·½Ê½¡£ÈÃÎÒÃÇÒÔÒ»ÖÖȫеķ½Ê½À´¿ª·¢Ç°¶Ë¡£

»ù±¾±à³ÌÄ£ÐÍ£¨Ä£°å + Ä£ÐÍ£©

ʹÓÃVueÖ¸ÁÒåÄ£°å

<div id="app">
<span>
{{name}}
</span>
</div>

ʹÓÃVue¶¨ÒåÊý¾ÝÄ£ÐÍ

var app2 = new Vue({
el: '#app',
data: { // ¶¨ÒåÄ£ÐÍÊý¾Ý
name: 'Hello, Tom!'
},
method: { // ¶¨Òå°ó¶¨Êý¾Ý·½·¨
sayHello: function() {
alert('hello!');
}
}
})

³£ÓÃÖ¸Áî½éÉÜ

×é¼þ»¯¿ª·¢

ÔÚǰ¶Ë¿ª·¢ÖÐÒýÈë×é¼þ»¯ÊÇÒ»¸ö´óµÄ½ø²½¡£Æäʵ£¬Èç¹ûÎÒÃÇÓùýһЩUI¿ò¼Ü¾Í»áÖªµÀ£¬´ó¶àÊýµÄUI¿ò¼Ü¶¼¶¨ÒåÁ˺ܶàµÄ×é¼þ£¬ÀýÈ磺button°´Å¥¡¢datagrid±í¸ñ×é¼þ¡¢treeÊ÷ÐÎ×é¼þ¡¢dialog¶Ô»°¿ò×é¼þµÈµÈ¡£µ«ÊÇ£¬Ö®Ç°ÎÒÃǶ¼ÊÇʹÓñðÈ˸øÎÒÃÇ¿ª·¢ºÃµÄ¿ò¼Ü¡£ÎÒÃǽñÌìҪѧϰÈçºÎʹÓÃVueÀ´¿ª·¢Ò»¸ö×Ô¼ºµÄ×é¼þ¡£½«À´£¬ÎÒÃÇ¿ÉÒÔ×Ô¼º¿ª·¢Ò»Ì××Ô¼ºµÄ×é¼þ¿â£¬È»ºóʹÓÃÕâЩ×é¼þ¿âÀ´¹¹½¨ÎÒÃǵÄǰ¶ËÓ¦ÓóÌÐò¡£

×é¼þ½á¹¹

¿ÉÒÔ°Ñ×é¼þÀí½âΪ¾ÍÊÇÒ»¸öСµÄÒ³ÃæÊÓͼ¡£Ê¹ÓÃVue¿ª·¢µÄ×é¼þÒ²·ÖΪÁ½¸ö²¿·Ö£º

ÊÓͼģ°å

ÊôÐÔ£¨Ä£ÐÍÊý¾Ý£©

ÊÓͼģ°åÒÀ¾ÉÊÇʹÓÃHTML/CSS+VueÖ¸Áµ«ÊÇÄ£ÐÍÊý¾ÝÏÖÔÚ¸ú֮ǰ²»Ì«Ò»Ñù£¬Ä£ÐÍÊý¾ÝÓ¦¸ÃÊÇʹÓÃ×é¼þµÄʱºò£¬¶¯Ì¬´«Èë½øÀ´µÄ¡£ËùÒÔ£¬Ä£ÐÍÊý¾ÝÐèÒªÏȶ¨Òå³öÀ´¡£

ʵÏÖÒ»¸ö¹ºÎï³µ³ÌÐò

<!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>¹ºÎï³µ</title>
<link rel="stylesheet" href="./bootstrap/css/bootstrap.css">
</head>
<body>
<div id="app" class="container">
<h1>¹ºÎï³µ</h1>
<hr>
<btn-grp :buttons="buttons"></btn-grp>
<btn-grp :buttons="buttons_test"></btn-grp>
<btn-grp :buttons="buttons"></btn-grp>
<btn-grp :buttons="buttons_test"></btn-grp>
<br>
<br>
<table class="table table-bordered table-striped table-hover">
<tr>
<th>ID</th>
<th>ÉÌÆ·Ãû³Æ</th>
<th>ÉÌÆ·¼Û¸ñ</th>
<th>ÉÌÆ·ÊýÁ¿</th>
<th>ÉÌÆ·×ܼÛ</th>
</tr>
<tr v-for="(prod, index) in products">
<td>{{index+1}}</td>
<td>{{prod.name}}</td>
<td>{{prod.price}}</td>
<td>
<button @click="changeCount(prod, -1)">-</button>
<input type="text" v-model="prod.count">
<button @click="changeCount(prod, 1)">+</button>
</td>
<td>{{prod.price * prod.count}}</td>
</tr>
<tr>
<td colspan="4" class="text-right">×ܼÛ:</td>
<td class="text-primary">{{getTotalMoney()}}</td>
</tr>
</table>
</div>
<script src="./vue.js"></script>
<script>
// ×Ô¶¨Òå×é¼þ£¬ÕâÀïʵÏÖÁËÒ»¸ö°´Å¥×é×é¼þ
Vue.component('btn-grp', {
props: ['buttons'],
template:
'<div class="btn-group" role="group">'
+ '<button type="button" @click="btn.handler" v-for="btn in buttons" :class="\'btn \' + (btn.class == null || btn.class == \'\' ? \'btn-default\':btn.class)">'
+ '{{btn.title}}'
+ '</button>'
+ '</div>'
});

var app = new Vue({
el: '#app',
data: {
// °´Å¥×é¼þ²âÊÔ
buttons_test: [
{title: '²âÊÔ1', class: 'btn-danger'},{title: '²âÊÔ2'},{title: '²âÊÔ3'},{title: '²âÊÔ4'},
],
buttons: [{
title: 'Ìí¼Ó',
class: 'btn-primary',
handler: function() {
alert('µã»÷Ìí¼Ó°´Å¥');
}
}, {
title: 'ÐÞ¸Ä',
class: 'btn-default',
handler: function() {
alert('µã»÷Ð޸İ´Å¥');
}
}, {
title: 'ɾ³ý',
class: 'btn-default',
handler: function() {
alert('µã»÷ɾ³ý°´Å¥');
}
}, ],
products: [
{
name: 'СÃ×6S',
price: 3999,
count: 1,
},
{
name: '´¸×Ó2',
price: 4999,
count: 1,
},
{
name: '»ªÎªP20',
price: 3599,
count: 1,
},
{
name: 'OPPO R15',
price: 2999,
count: 1,
},
{
name: 'OPPO R11',
price: 1999,
count: 1,
},
],
},
methods: {
// Óû§µã»÷¼Ó¼õÊýÁ¿Ê±µ÷ÓÃ
changeCount: function(prod, num) {
if(num < 0) {
if(prod.count > 0) {
prod.count += num;
}
}
else {
prod.count += num;
}
},
// »ñÈ¡×ܽð¶î
getTotalMoney: function() {
var totalMoney = 0.0;

for(var i = 0; i < this.products.length; ++i) {
totalMoney += parseFloat(this.products[i].price * this.products[i].count);
}

return totalMoney;
}
}
});
</script>
</body>
</html>

Ч¹ûͼ

ʹÓÃwebpack¹¹½¨Ç°¶Ë¹¤³Ì»¯

webpack½éÉÜ

webpackÊÇÒ»¸öǰ¶ËÏîÄ¿¹¹½¨¹¤¾ß¡£Ê¹ÓÃwebpack¿ÉÒÔ°Ñǰ¶Ëµ±³ÉÒ»¸ö¹¤³ÌÀ´¿ª·¢¡£¶øÇÒÄܹ»ºÜºÃµØ°Ñǰ¶ËµÄ¸÷Àà×ÊԴͳһ¹ÜÀí¡¢±àÒë¡¢´ò°ü¡£

ËüÊÇÒ»¸ö¡°±àÒëÆ÷¡±£¬¿ÉÒÔͨ¹ý¸÷ÖÖ²å¼þ½«»ùÓÚnode.js¡¢sass¡¢less±àд´úÂë±àÒë³ÉÄܹ»ÔËÐÐÔÚǰ¶Ëä¯ÀÀÆ÷µÄjavascript¡¢ºÍcss

ËüÊÇÒ»¸ö´ò°ü¹¤¾ß£¬¿ÉÒÔ½«ËùÓÐǰ¶ËµÄ×ÊÔ´´ò°üµ½Ò»¸öbundle.jsÖÐ

ÓÐÁËwebpack£¬ÎÒÃÇ¿ÉÒÔÏñ¿ª·¢ºó¶ËÓ¦ÓÃÒ»Ñù¿ª·¢Ç°¶Ë¡£

×ÜÌå½á¹¹Í¼

webpackÊÇ»ùÓÚnode.js¿ª·¢µÄÒ»¿îÓ¦Óã¬Æäʵwebpack¾ÍÊÇÒ»¸önode.jsµÄÄ£¿é¡£

°²×°webpack

´´½¨Ò»¸ö¿ÕµÄÎļþ¼Ð

ʹÓÃnpm init´´½¨package.json

°²×°cnpmÌÔ±¦¾µÏñ

ʹÓÃcnpm install vue-cli -gÈ«¾Ö°²×°vue-cliÄ£¿é

ʹÓÃvue init webpack cart´´½¨»ùÓÚwebpack¹ºÎï³µÏîÄ¿

ʹÓÃcnpm install bootstrap --save°²×°bootstrapÄ£¿é

¾ßÌå²½ÖèÇë²Î¿¼£ºhttps://www.webpackjs.com/guides/installation/

ʹÓÃwebpackÖØ¹¹¹ºÎï³µ³ÌÐò

ʹÓÃvue-cliÉú³ÉÏîÄ¿½ÅÊÖ¼ÜÈçÏÂͼ£º

½«Ô­À´±àдµÄbtn-grp×é¼þµ¥¶À±àдµ½BtnGrp.vueÎļþÖÐ

¿ÉÒÔ¿´µ½ÏÖÔÚ´úÂëÇåÎúÁ˺ܶ࣬template±êÇ©²¿·Ö±àдģ°å£¬script±êÇ©²¿·Ö±àд×é¼þµÄ½»»¥´úÂ룬±àд·½Ê½ºÍÔ­ÏÈдÔÚHTMLµÄ´úÂëÒ»ÖÂ

ÏÖÔÚÕû¸öǰ¶ËÓ¦Óö¼ÊÇ»ùÓÚ×é¼þ»¯µÄ£¬´úÂë±äµÃ¸ü¼ÓÇåÎúÁË

<template>
<div class="btn-group" role="group">
<button :key="btn.title"
type="button" @click="btn.handler"
v-for="btn in buttons"
:class="'btn ' + (btn.class == null || btn.class == '' ? 'btn-outline-secondary':btn.class)">
{{btn.title}}
</button>
</div>
</template>

<script>
export default {
props: ['buttons']
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>

½«Ô­À´Ð´ÔÚHTMLÖеĴúÂëÖØ¹¹µ½App.vueÖÐ

´Ë´¦ÒòΪÐèÒªÓõ½BtnGrp×é¼þ£¬ËùÒÔÐèÒªÏÈimport ×é¼þ£¬È»ºóÔÚcomponentsÖÐÒýÓøÃ×é¼þ

<template>
<div id="app" class="container">
<h1>WEBPACK + VUE&nbsp;ʵÏÖ¹ºÎï³µ</h1>
<BtnGrp :buttons="buttons"></BtnGrp>
<br/>
<br/>
<table class="table table-bordered table-striped table-hover">
<tr>
<th>ID</th>
<th>ÉÌÆ·Ãû³Æ</th>
<th>ÉÌÆ·¼Û¸ñ</th>
<th>ÉÌÆ·ÊýÁ¿</th>
<th>ÉÌÆ·×ܼÛ</th>
</tr>
<tr :key="index+1" v-for="(prod, index) in products">
<td>{{index+1}}</td>
<td>{{prod.name}}</td>
<td>{{prod.price}}</td>
<td>
<button class="btn btn-outline-info btn-sm" @click="changeCount(prod, -1)">-</button>
<input style="width:50px" type="text" v-model="prod.count">
button class="btn btn-outline-info btn-sm" @click="changeCount(prod, 1)">+</button>
</td>
<td>{{prod.price * prod.count}}</td>
</tr>
<tr>
<td colspan="4" class="text-right">×ܼÛ:</td>
<td class="text-primary">{{getTotalMoney()}}</td>
</tr>
</table>
</div>
</template>

<script>
/* eslint-disable no-new */
import 'bootstrap/dist/css/bootstrap.min.css'
import BtnGrp from './components/BtnGrp'

export default {
name: 'App',
components: {BtnGrp},
data () {
return {
products: [
{
name: 'СÃ×6S',
price: 3999,
count: 1,
},
{
name: '´¸×Ó2',
price: 4999,
count: 1,
},
{
name: '»ªÎªP20',
price: 3599,
count: 1,
},
{
name: 'OPPO R15',
price: 2999,
count: 1,
},
{
name: 'OPPO R11',
price: 1999,
count: 1,
},
],
buttons: [{
title: 'Ìí¼Ó',
class: 'btn-outline-primary',
handler: function() {
alert('µã»÷Ìí¼Ó°´Å¥');
}
}, {
title: 'ÐÞ¸Ä',
class: 'btn-outline-primary',
handler: function() {
alert('µã»÷Ð޸İ´Å¥');
}
}, {
title: 'ɾ³ý',
class: 'btn-outline-danger',
handler: function() {
alert('µã»÷ɾ³ý°´Å¥');
}
}, ],
changeCount: function(prod, num) {
if(num < 0) {
if(prod.count > 0) {
prod.count += num;
}
}
else {
prod.count += num;
}
},
getTotalMoney: function() {
var totalMoney = 0.0;

for(var i = 0; i < this.products.length; ++i) {
totalMoney += parseFloat(this.products[i].price * this.products[i].count);
}
?
return totalMoney;
}
}
}
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>

ÒòΪnpm°²×°µÄbootstrapÊÇbootstrap4£¬ËùÒÔÉÔ΢¶ÔÔ­ÏȵÄÑùʽµ÷ÕûÁËÏ¡£×îÖÕµÄЧ¹ûͼÈçÏ£º

 
   
1454 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
ÈçºÎÉè¼Æ¸ßÀ©Õ¹µÄÔÚÏßÍøÒ³ÖÆ×÷ƽ̨
electronÈëÃÅÐĵÃ
ʹÓà Electron ¹¹½¨×ÀÃæÓ¦ÓÃ
VUE.JS×é¼þ»¯¿ª·¢Êµ¼ù
ÉîÈëÀí½âJSCore
×îпγÌ
HTML 5 + CSS3 Ô­ÀíÓ뿪·¢Ó¦ÓÃ
Webǰ¶Ë¸ß¼¶¹¤³Ìʦ±Ø±¸¼¼ÄÜʵս
Vue´óÐÍÏîÄ¿¿ª·¢ÊµÕ½
ReactÔ­ÀíÓëʵ¼ù
Vue.js½ø½×Óë°¸Àýʵ¼ù
³É¹¦°¸Àý
Öн»¼¯ÍÅ ¹¹½¨Web×Ô¶¯»¯²âÊÔ¿ò¼Ü
ijָÃûµçÐŹ«Ë¾ Vue.js½ø½×Óë°¸Àý
¹úµçÍ¨ÍøÂç¼¼Êõ HTML5+CSS3 +webǰ¶Ë¿ò
ÒÆ¶¯Í¨ÐÅ ÒÆ¶¯»¥ÁªÍøÓ¦Óÿª·¢Ô­Àí
ijµçÁ¦ÐÐ android¿ª·¢Æ½Ì¨×î¼Ñ