mirror of
https://github.com/xsf0105/vue3-h5-template.git
synced 2025-04-05 19:41:57 +08:00
feat: vue3 + vite
This commit is contained in:
parent
d24e95450c
commit
07e396f08a
10
.babelrc
10
.babelrc
@ -1,10 +0,0 @@
|
||||
{
|
||||
"presets": [
|
||||
["env", {
|
||||
"modules": false,
|
||||
"targets": {
|
||||
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
|
||||
}
|
||||
}]
|
||||
]
|
||||
}
|
7
.gitignore
vendored
7
.gitignore
vendored
@ -1,4 +1,5 @@
|
||||
node_modules
|
||||
.DS_Store
|
||||
node_modules/
|
||||
dist/
|
||||
npm-debug.log
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
43
README.md
43
README.md
@ -1,22 +1,12 @@
|
||||
# Vue2-SPA
|
||||
|
||||
# 可能是全网最干净的 `vue` 脚手架
|
||||
|
||||
> A Vue.js project with `Webpack 4.x`
|
||||
|
||||
- 所有第三方包都已更新到最新
|
||||
- 没有多余代码,让你自己搭建,自己玩
|
||||
|
||||
## Live Demo
|
||||
The live demo can be found in [https://allan2coder.github.io/VUE2-SPA-Tutorial/](https://allan2coder.github.io/VUE2-SPA-Tutorial/) (移动端,打开浏览器开发者工具并调到手机窗口浏览。注:该项目同时适合PC端)
|
||||
|
||||
A Tutorial for Vue 3.
|
||||
|
||||
## How to use
|
||||
You should clone the repo and install the dependencies, and then npm start.That is all.
|
||||
|
||||
```bash
|
||||
$ git clone https://github.com/allan2coder/VUE2-SPA-Tutorial.git
|
||||
$ cd VUE2-SPA-Tutorial
|
||||
$ git clone https://github.com/allan2coder/VUE3-Tutorial.git
|
||||
$ cd VUE3-Tutorial
|
||||
$ npm install
|
||||
```
|
||||
Then launch the project app.
|
||||
@ -25,7 +15,7 @@ Then launch the project app.
|
||||
$ npm run dev
|
||||
```
|
||||
|
||||
You should see a new browser tap opening and a page of 'index.html' in http://localhost:8080.
|
||||
You should see a new browser tap opening and a page of 'index.html' in http://localhost:3000.
|
||||
|
||||
## How to build the static files
|
||||
|
||||
@ -33,31 +23,6 @@ You should see a new browser tap opening and a page of 'index.html' in http://lo
|
||||
npm run build
|
||||
```
|
||||
|
||||
## Screenshot
|
||||

|
||||

|
||||
|
||||
### 有关打包优化
|
||||
第三方库单独打包
|
||||
```
|
||||
npm i autodll-webpack-plugin -D
|
||||
```
|
||||
webpack 配置:
|
||||
```
|
||||
new AutoDllPlugin({
|
||||
inject: true, // will inject the DLL bundle to index.html
|
||||
debug: true,
|
||||
filename: '[name]_[hash].js',
|
||||
path: './dll',
|
||||
entry: {
|
||||
vendor: ['vue', 'vue-router'] // webpack 会去 `node_modules` 去找
|
||||
}
|
||||
})
|
||||
```
|
||||
每次打包,这个插件都会检查注册在 `entry` 中的第三方库。如果没有变化,插件就会使用缓存中的打包文件,减少了打包的时间,这时 Hash 也不会变化。
|
||||
|
||||
|
||||
|
||||
## Other SPA
|
||||
- [React.js](https://github.com/allan2coder/React-SPA) :fire: :fire: :fire:
|
||||
|
||||
|
@ -1,15 +0,0 @@
|
||||
const webpack = require('webpack');
|
||||
const config = require('./webpack.prod.conf');
|
||||
|
||||
webpack(config, (err, stats) => {
|
||||
if (err || stats.hasErrors()) {
|
||||
// 在这里处理错误
|
||||
console.error(err);
|
||||
return;
|
||||
}
|
||||
// 处理完成
|
||||
console.log(stats.toString({
|
||||
chunks: false, // 使构建过程更静默无输出
|
||||
colors: true // 在控制台展示颜色
|
||||
}));
|
||||
});
|
@ -1,55 +0,0 @@
|
||||
const path = require('path');
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
||||
const AutoDllPlugin = require('autodll-webpack-plugin');
|
||||
const VueLoaderPlugin = require('vue-loader/lib/plugin');
|
||||
|
||||
module.exports = {
|
||||
entry: {
|
||||
bundle: path.resolve(__dirname, '../src/index.js')
|
||||
},
|
||||
output: {
|
||||
path: path.resolve(__dirname, '../dist'),
|
||||
filename: '[name].[hash].js'
|
||||
},
|
||||
resolve: {
|
||||
extensions: ['*', '.js', '.json', '.vue'],
|
||||
alias: {
|
||||
'vue$': 'vue/dist/vue.esm.js',
|
||||
'@': path.resolve(__dirname, '../src'),
|
||||
}
|
||||
},
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.vue$/,
|
||||
loader: 'vue-loader'
|
||||
},
|
||||
{
|
||||
test: /\.js$/,
|
||||
use: 'babel-loader',
|
||||
exclude: /node_modules/
|
||||
},
|
||||
{
|
||||
test: /\.css$/,
|
||||
use: ['vue-style-loader', 'css-loader']
|
||||
}
|
||||
]
|
||||
},
|
||||
plugins: [
|
||||
new HtmlWebpackPlugin({
|
||||
template: path.resolve(__dirname, '../index.html')
|
||||
}),
|
||||
// Dll 优化,需要的时候可以打开
|
||||
// new AutoDllPlugin({
|
||||
// inject: true, // will inject the DLL bundle to index.html
|
||||
// debug: true,
|
||||
// filename: '[name]_[hash].js',
|
||||
// path: './dll',
|
||||
// entry: {
|
||||
// vendor: ['vue', 'vue-router']
|
||||
// }
|
||||
// }),
|
||||
new VueLoaderPlugin(),
|
||||
// new webpack.optimize.SplitChunksPlugin()
|
||||
]
|
||||
};
|
@ -1,20 +0,0 @@
|
||||
const merge = require("webpack-merge");
|
||||
const path = require("path");
|
||||
const baseConfig = require("./webpack.base.conf");
|
||||
|
||||
module.exports = merge(baseConfig, {
|
||||
mode: "development",
|
||||
devtool: "inline-source-map",
|
||||
module: {
|
||||
rules: [ // 自己拓展着玩呀
|
||||
// {
|
||||
// test: /\.css$/,
|
||||
// use: ["vue-style-loader", "css-loader", "postcss-loader"],
|
||||
// },
|
||||
],
|
||||
},
|
||||
devServer: {
|
||||
contentBase: path.resolve(__dirname, "../dist"),
|
||||
open: true,
|
||||
},
|
||||
});
|
@ -1,27 +0,0 @@
|
||||
const merge = require("webpack-merge");
|
||||
const path = require("path");
|
||||
const baseConfig = require("./webpack.base.conf");
|
||||
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
|
||||
|
||||
module.exports = merge(baseConfig, {
|
||||
mode: "production",
|
||||
devtool: "source-map",
|
||||
module: {
|
||||
rules: [ // 自己拓展着玩呀
|
||||
// {
|
||||
// test: /\.css$/,
|
||||
// use: [
|
||||
// 'css-loader',
|
||||
// 'postcss-loader',
|
||||
// ]
|
||||
// },
|
||||
],
|
||||
},
|
||||
plugins: [
|
||||
new CleanWebpackPlugin({
|
||||
root: path.resolve(__dirname, "../"),
|
||||
verbose: true,
|
||||
dry: false,
|
||||
}),
|
||||
],
|
||||
});
|
17
index.html
17
index.html
@ -1,18 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-touch-fullscreen" content="yes">
|
||||
<meta name="full-screen" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||
<meta name="format-detection" content="telephone=no">
|
||||
<meta name="format-detection" content="address=no">
|
||||
<title>vue2spa</title>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Vite App</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<!-- built files will be auto injected -->
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
483
package-lock.json
generated
Normal file
483
package-lock.json
generated
Normal file
@ -0,0 +1,483 @@
|
||||
{
|
||||
"name": "vite-project",
|
||||
"version": "0.0.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@babel/helper-validator-identifier": {
|
||||
"version": "7.12.11",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/@babel%2fhelper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
|
||||
"integrity": "sha1-yaHwIZF9y1zPDU5FPjmQIpgfye0="
|
||||
},
|
||||
"@babel/parser": {
|
||||
"version": "7.13.13",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/@babel%2fparser/-/parser-7.13.13.tgz",
|
||||
"integrity": "sha1-QvA4YvSu1QRh5UMnCRa0fdUB8N8="
|
||||
},
|
||||
"@babel/types": {
|
||||
"version": "7.13.14",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/@babel%2ftypes/-/types-7.13.14.tgz",
|
||||
"integrity": "sha1-w1pKuxXHzUWidG14qzKONiy6zg0=",
|
||||
"requires": {
|
||||
"@babel/helper-validator-identifier": "^7.12.11",
|
||||
"lodash": "^4.17.19",
|
||||
"to-fast-properties": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"@vitejs/plugin-vue": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/@vitejs%2fplugin-vue/-/plugin-vue-1.2.1.tgz",
|
||||
"integrity": "sha1-beSUNvw0b4KaVmdgZkKOPwEVIqw=",
|
||||
"dev": true
|
||||
},
|
||||
"@vue/compiler-core": {
|
||||
"version": "3.0.10",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/@vue%2fcompiler-core/-/compiler-core-3.0.10.tgz",
|
||||
"integrity": "sha1-ztkhIMa5ure2xE3+Xj5c8upCJTE=",
|
||||
"requires": {
|
||||
"@babel/parser": "^7.12.0",
|
||||
"@babel/types": "^7.12.0",
|
||||
"@vue/shared": "3.0.10",
|
||||
"estree-walker": "^2.0.1",
|
||||
"source-map": "^0.6.1"
|
||||
}
|
||||
},
|
||||
"@vue/compiler-dom": {
|
||||
"version": "3.0.10",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/@vue%2fcompiler-dom/-/compiler-dom-3.0.10.tgz",
|
||||
"integrity": "sha1-WdNZdJjn1LC5LziGqCP5nVsI8f4=",
|
||||
"requires": {
|
||||
"@vue/compiler-core": "3.0.10",
|
||||
"@vue/shared": "3.0.10"
|
||||
}
|
||||
},
|
||||
"@vue/compiler-sfc": {
|
||||
"version": "3.0.10",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/@vue%2fcompiler-sfc/-/compiler-sfc-3.0.10.tgz",
|
||||
"integrity": "sha1-3mvJvn9asdlEBIqb4Exyw1cdQyE=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@babel/parser": "^7.13.9",
|
||||
"@babel/types": "^7.13.0",
|
||||
"@vue/compiler-core": "3.0.10",
|
||||
"@vue/compiler-dom": "3.0.10",
|
||||
"@vue/compiler-ssr": "3.0.10",
|
||||
"@vue/shared": "3.0.10",
|
||||
"consolidate": "^0.16.0",
|
||||
"estree-walker": "^2.0.1",
|
||||
"hash-sum": "^2.0.0",
|
||||
"lru-cache": "^5.1.1",
|
||||
"magic-string": "^0.25.7",
|
||||
"merge-source-map": "^1.1.0",
|
||||
"postcss": "^8.1.10",
|
||||
"postcss-modules": "^4.0.0",
|
||||
"postcss-selector-parser": "^6.0.4",
|
||||
"source-map": "^0.6.1"
|
||||
}
|
||||
},
|
||||
"@vue/compiler-ssr": {
|
||||
"version": "3.0.10",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/@vue%2fcompiler-ssr/-/compiler-ssr-3.0.10.tgz",
|
||||
"integrity": "sha1-bMxke9pJwPwcoQAhnpxxJo4EgSA=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@vue/compiler-dom": "3.0.10",
|
||||
"@vue/shared": "3.0.10"
|
||||
}
|
||||
},
|
||||
"@vue/reactivity": {
|
||||
"version": "3.0.10",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/@vue%2freactivity/-/reactivity-3.0.10.tgz",
|
||||
"integrity": "sha1-ASgwczKR5ggn87Io1CWtU7g0hM4=",
|
||||
"requires": {
|
||||
"@vue/shared": "3.0.10"
|
||||
}
|
||||
},
|
||||
"@vue/runtime-core": {
|
||||
"version": "3.0.10",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/@vue%2fruntime-core/-/runtime-core-3.0.10.tgz",
|
||||
"integrity": "sha1-y4cwwOyG6lwc+nAfrMCpe/WbFaI=",
|
||||
"requires": {
|
||||
"@vue/reactivity": "3.0.10",
|
||||
"@vue/shared": "3.0.10"
|
||||
}
|
||||
},
|
||||
"@vue/runtime-dom": {
|
||||
"version": "3.0.10",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/@vue%2fruntime-dom/-/runtime-dom-3.0.10.tgz",
|
||||
"integrity": "sha1-gMbuKMrqv3TzE1fSxk0XeUW9il8=",
|
||||
"requires": {
|
||||
"@vue/runtime-core": "3.0.10",
|
||||
"@vue/shared": "3.0.10",
|
||||
"csstype": "^2.6.8"
|
||||
}
|
||||
},
|
||||
"@vue/shared": {
|
||||
"version": "3.0.10",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/@vue%2fshared/-/shared-3.0.10.tgz",
|
||||
"integrity": "sha1-VHbVYV0BvzOcZcLoBPWQm7wnhEo="
|
||||
},
|
||||
"big.js": {
|
||||
"version": "5.2.2",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/big.js/-/big.js-5.2.2.tgz",
|
||||
"integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=",
|
||||
"dev": true
|
||||
},
|
||||
"bluebird": {
|
||||
"version": "3.7.2",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/bluebird/-/bluebird-3.7.2.tgz",
|
||||
"integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=",
|
||||
"dev": true
|
||||
},
|
||||
"colorette": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/colorette/-/colorette-1.2.2.tgz",
|
||||
"integrity": "sha1-y8x51emcrqLb8Q6zom/Ys+as+pQ=",
|
||||
"dev": true
|
||||
},
|
||||
"consolidate": {
|
||||
"version": "0.16.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/consolidate/-/consolidate-0.16.0.tgz",
|
||||
"integrity": "sha1-oRhkdokw8vGUMWYKZZBmaPX73BY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"bluebird": "^3.7.2"
|
||||
}
|
||||
},
|
||||
"cssesc": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/cssesc/-/cssesc-3.0.0.tgz",
|
||||
"integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=",
|
||||
"dev": true
|
||||
},
|
||||
"csstype": {
|
||||
"version": "2.6.16",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/csstype/-/csstype-2.6.16.tgz",
|
||||
"integrity": "sha1-VE1p9UcBO4WkDRW/912zjzT+nDk="
|
||||
},
|
||||
"emojis-list": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/emojis-list/-/emojis-list-3.0.0.tgz",
|
||||
"integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=",
|
||||
"dev": true
|
||||
},
|
||||
"esbuild": {
|
||||
"version": "0.9.7",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/esbuild/-/esbuild-0.9.7.tgz",
|
||||
"integrity": "sha1-6g1jnL5LiOwl++1Nb/AMjXiO9ws=",
|
||||
"dev": true
|
||||
},
|
||||
"estree-walker": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/estree-walker/-/estree-walker-2.0.2.tgz",
|
||||
"integrity": "sha1-UvAQF4wqTBF6d1fP6UKtt9LaTKw="
|
||||
},
|
||||
"fsevents": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/fsevents/-/fsevents-2.3.2.tgz",
|
||||
"integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"function-bind": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/function-bind/-/function-bind-1.1.1.tgz",
|
||||
"integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=",
|
||||
"dev": true
|
||||
},
|
||||
"generic-names": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/generic-names/-/generic-names-2.0.1.tgz",
|
||||
"integrity": "sha1-+KN46tLMqno08DF7BVVIMq5BuHI=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"loader-utils": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"has": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/has/-/has-1.0.3.tgz",
|
||||
"integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"function-bind": "^1.1.1"
|
||||
}
|
||||
},
|
||||
"hash-sum": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/hash-sum/-/hash-sum-2.0.0.tgz",
|
||||
"integrity": "sha1-gdAbtd6OpKIUrV1urRtSNGCwtFo=",
|
||||
"dev": true
|
||||
},
|
||||
"icss-replace-symbols": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
|
||||
"integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
|
||||
"dev": true
|
||||
},
|
||||
"icss-utils": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/icss-utils/-/icss-utils-5.1.0.tgz",
|
||||
"integrity": "sha1-xr5oWKvQE9do6YNmrkfiXViHsa4=",
|
||||
"dev": true
|
||||
},
|
||||
"indexes-of": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/indexes-of/-/indexes-of-1.0.1.tgz",
|
||||
"integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
|
||||
"dev": true
|
||||
},
|
||||
"is-core-module": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/is-core-module/-/is-core-module-2.2.0.tgz",
|
||||
"integrity": "sha1-lwN+89UiJNhRY/VZeytj2a/tmBo=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"has": "^1.0.3"
|
||||
}
|
||||
},
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/json5/-/json5-1.0.1.tgz",
|
||||
"integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"loader-utils": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/loader-utils/-/loader-utils-1.4.0.tgz",
|
||||
"integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"big.js": "^5.2.2",
|
||||
"emojis-list": "^3.0.0",
|
||||
"json5": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"lodash": {
|
||||
"version": "4.17.21",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/lodash/-/lodash-4.17.21.tgz",
|
||||
"integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw="
|
||||
},
|
||||
"lodash.camelcase": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
|
||||
"integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
|
||||
"dev": true
|
||||
},
|
||||
"lru-cache": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/lru-cache/-/lru-cache-5.1.1.tgz",
|
||||
"integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"yallist": "^3.0.2"
|
||||
}
|
||||
},
|
||||
"magic-string": {
|
||||
"version": "0.25.7",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/magic-string/-/magic-string-0.25.7.tgz",
|
||||
"integrity": "sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"sourcemap-codec": "^1.4.4"
|
||||
}
|
||||
},
|
||||
"merge-source-map": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/merge-source-map/-/merge-source-map-1.1.0.tgz",
|
||||
"integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"source-map": "^0.6.1"
|
||||
}
|
||||
},
|
||||
"minimist": {
|
||||
"version": "1.2.5",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/minimist/-/minimist-1.2.5.tgz",
|
||||
"integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=",
|
||||
"dev": true
|
||||
},
|
||||
"nanoid": {
|
||||
"version": "3.1.22",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/nanoid/-/nanoid-3.1.22.tgz",
|
||||
"integrity": "sha1-s1+Pt9FRmQqK69WqUBXAPPcm+EQ=",
|
||||
"dev": true
|
||||
},
|
||||
"path-parse": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/path-parse/-/path-parse-1.0.6.tgz",
|
||||
"integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=",
|
||||
"dev": true
|
||||
},
|
||||
"postcss": {
|
||||
"version": "8.2.9",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/postcss/-/postcss-8.2.9.tgz",
|
||||
"integrity": "sha1-/ZX/N7XO5VxAmz/dI3KWq0CW+6M=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"colorette": "^1.2.2",
|
||||
"nanoid": "^3.1.22",
|
||||
"source-map": "^0.6.1"
|
||||
}
|
||||
},
|
||||
"postcss-modules": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/postcss-modules/-/postcss-modules-4.0.0.tgz",
|
||||
"integrity": "sha1-K8fydquI8/Gw+t9svXdy1DtfO5s=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"generic-names": "^2.0.1",
|
||||
"icss-replace-symbols": "^1.1.0",
|
||||
"lodash.camelcase": "^4.3.0",
|
||||
"postcss-modules-extract-imports": "^3.0.0",
|
||||
"postcss-modules-local-by-default": "^4.0.0",
|
||||
"postcss-modules-scope": "^3.0.0",
|
||||
"postcss-modules-values": "^4.0.0",
|
||||
"string-hash": "^1.1.1"
|
||||
}
|
||||
},
|
||||
"postcss-modules-extract-imports": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
|
||||
"integrity": "sha1-zaHwR8CugMl9vijD52pDuIAldB0=",
|
||||
"dev": true
|
||||
},
|
||||
"postcss-modules-local-by-default": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
|
||||
"integrity": "sha1-67tU+uFZjuz99pGgKz/zs5ClpRw=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"icss-utils": "^5.0.0",
|
||||
"postcss-selector-parser": "^6.0.2",
|
||||
"postcss-value-parser": "^4.1.0"
|
||||
}
|
||||
},
|
||||
"postcss-modules-scope": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
|
||||
"integrity": "sha1-nvMVFFbTu/oSDKRImN/Kby+gHwY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"postcss-selector-parser": "^6.0.4"
|
||||
}
|
||||
},
|
||||
"postcss-modules-values": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
|
||||
"integrity": "sha1-18Xn5ow7s8myfL9Iyguz/7RgLJw=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"icss-utils": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"postcss-selector-parser": {
|
||||
"version": "6.0.4",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
|
||||
"integrity": "sha1-VgdaE4CgRgTDiwY+p3Z6Epr1wrM=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"cssesc": "^3.0.0",
|
||||
"indexes-of": "^1.0.1",
|
||||
"uniq": "^1.0.1",
|
||||
"util-deprecate": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"postcss-value-parser": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
|
||||
"integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=",
|
||||
"dev": true
|
||||
},
|
||||
"resolve": {
|
||||
"version": "1.20.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/resolve/-/resolve-1.20.0.tgz",
|
||||
"integrity": "sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-core-module": "^2.2.0",
|
||||
"path-parse": "^1.0.6"
|
||||
}
|
||||
},
|
||||
"rollup": {
|
||||
"version": "2.44.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/rollup/-/rollup-2.44.0.tgz",
|
||||
"integrity": "sha1-jaMk0cT9Er7vmubhL0BoJlttles=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"fsevents": "~2.3.1"
|
||||
}
|
||||
},
|
||||
"source-map": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/source-map/-/source-map-0.6.1.tgz",
|
||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
|
||||
},
|
||||
"sourcemap-codec": {
|
||||
"version": "1.4.8",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
|
||||
"integrity": "sha1-6oBL2UhXQC5pktBaOO8a41qatMQ=",
|
||||
"dev": true
|
||||
},
|
||||
"string-hash": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/string-hash/-/string-hash-1.1.3.tgz",
|
||||
"integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=",
|
||||
"dev": true
|
||||
},
|
||||
"to-fast-properties": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
|
||||
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
|
||||
},
|
||||
"uniq": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/uniq/-/uniq-1.0.1.tgz",
|
||||
"integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
|
||||
"dev": true
|
||||
},
|
||||
"util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
|
||||
"dev": true
|
||||
},
|
||||
"vite": {
|
||||
"version": "2.1.5",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/vite/-/vite-2.1.5.tgz",
|
||||
"integrity": "sha1-SFfaRBxi95gsg8vV9CoAMw8gycE=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"esbuild": "^0.9.3",
|
||||
"fsevents": "~2.3.1",
|
||||
"postcss": "^8.2.1",
|
||||
"resolve": "^1.19.0",
|
||||
"rollup": "^2.38.5"
|
||||
}
|
||||
},
|
||||
"vue": {
|
||||
"version": "3.0.10",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/vue/-/vue-3.0.10.tgz",
|
||||
"integrity": "sha1-tdKAHGrA51bIUK16j5p4y8y60Co=",
|
||||
"requires": {
|
||||
"@vue/compiler-dom": "3.0.10",
|
||||
"@vue/runtime-dom": "3.0.10",
|
||||
"@vue/shared": "3.0.10"
|
||||
}
|
||||
},
|
||||
"vue-router": {
|
||||
"version": "4.0.5",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/vue-router/-/vue-router-4.0.5.tgz",
|
||||
"integrity": "sha1-3QpBNLyVDDeu9kuXPp7hAIQo2Po="
|
||||
},
|
||||
"yallist": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "http://nodepackages.hellobike.cn:4873/yallist/-/yallist-3.1.1.tgz",
|
||||
"integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
}
|
48
package.json
48
package.json
@ -1,44 +1,18 @@
|
||||
{
|
||||
"name": "vue2-spa-tutorial",
|
||||
"version": "1.0.0",
|
||||
"author": "Allan",
|
||||
"description": "最干净的脚手架",
|
||||
"main": "index.js",
|
||||
"name": "vue3-vite",
|
||||
"version": "0.0.0",
|
||||
"scripts": {
|
||||
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
|
||||
"build": "node build/build.js"
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"serve": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"vue": "^2.6.11",
|
||||
"vue-router": "^3.2.0"
|
||||
"vue": "^3.0.5",
|
||||
"vue-router": "^4.0.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"autodll-webpack-plugin": "^0.4.2",
|
||||
"autoprefixer": "^6.7.7",
|
||||
"babel-core": "^6.26.3",
|
||||
"babel-loader": "^7.1.5",
|
||||
"babel-preset-env": "^1.7.0",
|
||||
"clean-webpack-plugin": "^3.0.0",
|
||||
"css-loader": "^3.5.3",
|
||||
"file-loader": "^6.0.0",
|
||||
"html-webpack-plugin": "^4.0.0-beta.14",
|
||||
"mini-css-extract-plugin": "^0.9.0",
|
||||
"postcss-loader": "^3.0.0",
|
||||
"vue-loader": "^15.9.2",
|
||||
"vue-style-loader": "^4.1.2",
|
||||
"vue-template-compiler": "^2.6.11",
|
||||
"webpack": "^4.43.0",
|
||||
"webpack-cli": "^3.3.11",
|
||||
"webpack-dev-server": "^3.11.0"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/allan2coder/VUE2-SPA-Tutorial.git"
|
||||
},
|
||||
"keywords": [
|
||||
"webpack4",
|
||||
"vue2",
|
||||
"vue3"
|
||||
],
|
||||
"license": "ISC"
|
||||
"@vitejs/plugin-vue": "^1.2.1",
|
||||
"@vue/compiler-sfc": "^3.0.5",
|
||||
"vite": "^2.1.5"
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +0,0 @@
|
||||
module.exports = {
|
||||
plugins: [
|
||||
require('autoprefixer')
|
||||
]
|
||||
}
|
BIN
public/favicon.ico
Normal file
BIN
public/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.2 KiB |
34
src/App.vue
34
src/App.vue
@ -1,26 +1,10 @@
|
||||
<template>
|
||||
<div>
|
||||
<!-- 删除试试 顶部 -->
|
||||
<HeaderCompontent></HeaderCompontent>
|
||||
<!-- 渲染出口 -->
|
||||
<router-view></router-view>
|
||||
<!-- 删除试试 底部菜单 -->
|
||||
<FootComponent></FootComponent>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import HeaderCompontent from './components/header.vue'
|
||||
import FootComponent from './components/footer.vue'
|
||||
export default{
|
||||
components:{
|
||||
HeaderCompontent,
|
||||
FootComponent
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
body, ul, h4{
|
||||
margin: 0;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="nav">
|
||||
<router-link to="/">Home</router-link> |
|
||||
<router-link to="/about">About</router-link>
|
||||
</div>
|
||||
|
||||
<router-view />
|
||||
|
||||
</template>
|
30
src/components/HelloWorld.vue
Normal file
30
src/components/HelloWorld.vue
Normal file
@ -0,0 +1,30 @@
|
||||
<template>
|
||||
<h1>{{ msg }}</h1>
|
||||
|
||||
<p>
|
||||
<a href="https://vitejs.dev/guide/features.html" target="_blank">Vite Documentation</a> |
|
||||
<a href="https://v3.vuejs.org/" target="_blank">Vue 3 Documentation</a>
|
||||
</p>
|
||||
|
||||
<button @click="state.count++">count is: {{ state.count }}</button>
|
||||
<p>
|
||||
Edit
|
||||
<code>components/HelloWorld.vue</code> to test hot module replacement.
|
||||
</p>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { defineProps, reactive } from 'vue'
|
||||
|
||||
defineProps({
|
||||
msg: String
|
||||
})
|
||||
|
||||
const state = reactive({ count: 0 })
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
a {
|
||||
color: #42b983;
|
||||
}
|
||||
</style>
|
@ -1,42 +0,0 @@
|
||||
<template>
|
||||
<footer class="fixed-bottom clearfix">
|
||||
<div class="col4">
|
||||
<router-link to="/index">index</router-link>
|
||||
</div>
|
||||
<div class="col4">
|
||||
<router-link to="/second">menu3</router-link>
|
||||
</div>
|
||||
<div class="col4">
|
||||
<router-link to="/third">menu4</router-link>
|
||||
</div>
|
||||
</footer>
|
||||
</template>
|
||||
<script>
|
||||
export default{
|
||||
data(){
|
||||
return{
|
||||
msg: 'Hello vue'
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
.fixed-bottom {
|
||||
position: fixed;
|
||||
background: #fff;
|
||||
width: 100%;
|
||||
bottom: 0;
|
||||
z-index: 99;
|
||||
border-top: 1px solid #ccc;
|
||||
display: grid;
|
||||
text-align: center;
|
||||
grid-template-columns: 33% 33% 33%;
|
||||
}
|
||||
.fixed-bottom a {
|
||||
width: 100%;
|
||||
display: inline-block;
|
||||
font-size: 12px;
|
||||
color: #7a7a7a;
|
||||
line-height: 50px;
|
||||
}
|
||||
</style>
|
@ -1,16 +0,0 @@
|
||||
<template>
|
||||
<div class="header">
|
||||
<img src="https://png2.cleanpng.com/sh/9f5efd7936dbbc0513a929a7809ebd10/L0KzQYm3V8E5N5pnR91yc4Pzfri0lwVmNZt4RdxqdnH2c8PwkQQudJpnitN7eT3kfrj8jPFzcqQyitdqY4SwhsbsTfp0NWZnTNdrZUHmQIq4Wck0NmkATaI7OEK8QYa6Ucg5P2I4SqI8N0OxgLBu/kisspng-vue-js-javascript-library-angularjs-react-vue-js-5b4ebe1c091993.8950282915318871320373.png" />
|
||||
</div>
|
||||
</template>
|
||||
<style>
|
||||
.header{
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.header img{
|
||||
width: 50%;
|
||||
margin: 30px auto 30px;
|
||||
display: block;
|
||||
}
|
||||
</style>
|
@ -1,33 +0,0 @@
|
||||
<template>
|
||||
<div class="second-wrap">
|
||||
<h4>这是子组件</h4>
|
||||
<p>这是<span>来自父组件</span>的数据:{{myMessage}}</p>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'child',
|
||||
props: [
|
||||
'myMessage',
|
||||
]
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.second-wrap{
|
||||
margin-top: 30px;
|
||||
text-align: center;
|
||||
}
|
||||
h4,p{
|
||||
color: #41b883;;
|
||||
font-size: 20px;
|
||||
}
|
||||
p{
|
||||
font-size: 12px;
|
||||
}
|
||||
span{
|
||||
color: #35495e;
|
||||
}
|
||||
</style>
|
||||
|
@ -1,30 +0,0 @@
|
||||
<template>
|
||||
<div class="thirdComponent">
|
||||
<button v-on:click="increment">{{ counter }}</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'button-counter',
|
||||
data: () => ({
|
||||
counter: 0,
|
||||
}),
|
||||
methods: {
|
||||
increment: function () {
|
||||
this.counter += 1
|
||||
this.$emit('increment')
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.thirdComponent{
|
||||
display: inline-block;
|
||||
}
|
||||
button{
|
||||
color: #41b883;
|
||||
border-color: #41b883;
|
||||
}
|
||||
</style>
|
@ -1,9 +0,0 @@
|
||||
// 项目启动
|
||||
import Vue from "vue";
|
||||
import App from "./App";
|
||||
import router from "./router";
|
||||
|
||||
new Vue({
|
||||
router: router, // 注册路由
|
||||
render: (h) => h(App),
|
||||
}).$mount("#app"); // 渲染挂载
|
5
src/main.js
Normal file
5
src/main.js
Normal file
@ -0,0 +1,5 @@
|
||||
import { createApp } from 'vue';
|
||||
import App from './App.vue';
|
||||
import router from './router';
|
||||
|
||||
createApp(App).use(router).mount('#app')
|
@ -1,17 +0,0 @@
|
||||
// mock data
|
||||
export const data = {
|
||||
success: true,
|
||||
data: [{
|
||||
name: "React",
|
||||
id: 1,
|
||||
},{
|
||||
name: "Vue",
|
||||
id: 2,
|
||||
},{
|
||||
name: "Angular",
|
||||
id: 3,
|
||||
},{
|
||||
name: "Flutter",
|
||||
id: 4,
|
||||
}]
|
||||
};
|
@ -1,69 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<button v-on:click="loadMore">click me</button>
|
||||
<ul>
|
||||
<li v-for="(item, index) in listArr" :key="index">
|
||||
<a href="">{{ index }} 《{{ item.name }}》</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
let mock = require('../mock'); // 模拟请求
|
||||
|
||||
export default {
|
||||
data: () => ({
|
||||
listArr: [],
|
||||
page: 1,
|
||||
}),
|
||||
created() {
|
||||
this.loadList();
|
||||
},
|
||||
methods: {
|
||||
loadList(page) {
|
||||
const {data, success} = mock.data;
|
||||
if (this.page > 1) {
|
||||
console.log("page is:", this.page);
|
||||
return this.listArr = this.listArr.concat(data);
|
||||
}
|
||||
this.listArr = data;
|
||||
},
|
||||
loadMore() {
|
||||
this.loadList(this.page++);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
button {
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
line-height: 30px;
|
||||
border: 1px solid #ddd;
|
||||
color: #41b883;
|
||||
}
|
||||
a {
|
||||
color: #35495e;
|
||||
font-size: 16px;
|
||||
text-decoration: none;
|
||||
}
|
||||
ul {
|
||||
margin-bottom: 60px;
|
||||
padding: 20px;
|
||||
}
|
||||
li {
|
||||
line-height: 32px;
|
||||
border-bottom: 1px solid #ddd;
|
||||
padding: 0 10px;
|
||||
text-align: left;
|
||||
list-style: none;
|
||||
}
|
||||
b {
|
||||
font-size: 12px;
|
||||
color: #35495e;
|
||||
}
|
||||
.loading {
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
@ -1,44 +0,0 @@
|
||||
<template>
|
||||
<div class="container">
|
||||
|
||||
<!-- 父组件内容 -->
|
||||
<h4>这是父组件</h4>
|
||||
<p>这是父组件正在渲染的数据:{{parentMsg}}</p>
|
||||
<input type="" v-model="parentMsg" autofocus="autofocus" placeholder="type something" />
|
||||
|
||||
<!-- 子组件内容 -->
|
||||
<child :my-message="parentMsg"></child>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Child from '../components/secondcomponent.vue'
|
||||
|
||||
export default {
|
||||
data: () => ({
|
||||
parentMsg: '',
|
||||
}),
|
||||
components: { // 挂载组件
|
||||
Child
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
h4,p{
|
||||
color: #35495e;
|
||||
font-size: 20px;
|
||||
}
|
||||
p{
|
||||
font-size: 14px;
|
||||
}
|
||||
input{
|
||||
margin: 4px;
|
||||
outline: none;
|
||||
border: 1px solid #ddd;
|
||||
line-height: 24px;
|
||||
min-width: 300px;
|
||||
padding-left: 10px;
|
||||
}
|
||||
</style>
|
@ -1,55 +0,0 @@
|
||||
<template>
|
||||
<div class="container">
|
||||
|
||||
<!-- 这是父组件内容 -->
|
||||
<h4>子组件数据传递给父组件</h4>
|
||||
<p>方式:用自定义事件</p>
|
||||
<p class="parent-title">这是父组件</p>
|
||||
|
||||
<!-- 父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。 -->
|
||||
<h2 class="text-center">{{ total }}</h2>
|
||||
|
||||
|
||||
<!-- 这是子组件内容 -->
|
||||
<div class="text-center">
|
||||
<p>这是子组件</p>
|
||||
<buttonCounter v-on:increment="incrementTotal"></buttonCounter>
|
||||
<buttonCounter v-on:increment="incrementTotal"></buttonCounter>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import buttonCounter from '../components/thirdcomponent.vue'
|
||||
|
||||
export default {
|
||||
data: () => ({
|
||||
parentMsg: '子组件传递信息给父元素',
|
||||
total: 0,
|
||||
}),
|
||||
methods: {
|
||||
incrementTotal: function () {
|
||||
this.total += 1
|
||||
}
|
||||
},
|
||||
components: {
|
||||
buttonCounter
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.parent-title{
|
||||
margin-top: 30px;
|
||||
}
|
||||
h4{
|
||||
font-size: 20px;
|
||||
}
|
||||
h2{
|
||||
margin: 0 0 40px;
|
||||
}
|
||||
.text-center p {
|
||||
color: #41b883;
|
||||
}
|
||||
</style>
|
@ -1,29 +1,23 @@
|
||||
import Vue from 'vue'
|
||||
import VueRouter from 'vue-router'
|
||||
import { createWebHistory, createRouter } from "vue-router";
|
||||
import Home from "../views/Home.vue";
|
||||
import About from "../views/About.vue";
|
||||
|
||||
/* 开启debug模式 */
|
||||
Vue.config.debug = true
|
||||
Vue.use(VueRouter);
|
||||
const routes = [
|
||||
{
|
||||
path: "/",
|
||||
name: "Home",
|
||||
component: Home,
|
||||
},
|
||||
{
|
||||
path: "/about",
|
||||
name: "About",
|
||||
component: About,
|
||||
},
|
||||
];
|
||||
|
||||
import Index from '../pages/index'
|
||||
import SecondComponent from '../pages/otherPages'
|
||||
import ThirdComponent from '../pages/otherPages2'
|
||||
const router = createRouter({
|
||||
history: createWebHistory(),
|
||||
routes,
|
||||
});
|
||||
|
||||
export default new VueRouter({
|
||||
mode: 'hash', // 还有 history 等
|
||||
base: __dirname,
|
||||
routes: [
|
||||
{
|
||||
path: '/index',
|
||||
component: Index,
|
||||
},
|
||||
{
|
||||
path: '/second',
|
||||
component: SecondComponent,
|
||||
},
|
||||
{
|
||||
path: '/third',
|
||||
component: ThirdComponent,
|
||||
}
|
||||
]
|
||||
})
|
||||
export default router;
|
3
src/views/About.vue
Normal file
3
src/views/About.vue
Normal file
@ -0,0 +1,3 @@
|
||||
<template>
|
||||
<h1>About Page</h1>
|
||||
</template>
|
20
src/views/Home.vue
Normal file
20
src/views/Home.vue
Normal file
@ -0,0 +1,20 @@
|
||||
<template>
|
||||
<h1>{{ msg }}</h1>
|
||||
<button @click="state.count++">count is: {{ state.count }}</button>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { defineProps, reactive } from 'vue';
|
||||
|
||||
defineProps({
|
||||
msg: String
|
||||
})
|
||||
|
||||
const state = reactive({ count: 0 })
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
a {
|
||||
color: #42b983;
|
||||
}
|
||||
</style>
|
7
vite.config.js
Normal file
7
vite.config.js
Normal file
@ -0,0 +1,7 @@
|
||||
import { defineConfig } from 'vite'
|
||||
import vue from '@vitejs/plugin-vue'
|
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [vue()]
|
||||
})
|
Loading…
x
Reference in New Issue
Block a user