add example about routing

This commit is contained in:
Andreas Zweili 2021-09-06 12:36:13 +02:00
parent c395d863f1
commit 8b8f6387ac
17 changed files with 12611 additions and 1 deletions

View File

@ -0,0 +1,3 @@
> 1%
last 2 versions
not dead

View File

@ -0,0 +1,17 @@
module.exports = {
root: true,
env: {
node: true
},
'extends': [
'plugin:vue/vue3-essential',
'eslint:recommended'
],
parserOptions: {
parser: 'babel-eslint'
},
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
}
}

View File

@ -0,0 +1,22 @@
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

View File

@ -0,0 +1,3 @@
{
"singleQuote": true
}

View File

@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,24 @@
{
"name": "vue-first-app",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"core-js": "^3.6.5",
"vue": "^3.0.0",
"vue-router": "^4.0.0-0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.5.0",
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/cli-service": "~4.5.0",
"@vue/compiler-sfc": "^3.0.0-0",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^7.0.0-0"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

View File

@ -0,0 +1,68 @@
<template>
<the-header></the-header>
<router-view></router-view>
</template>
<script>
import { ref, provide } from 'vue';
import TheHeader from './components/TheHeader.vue';
export default {
components: {
TheHeader,
},
setup() {
const products = ref([
{
id: 'p1',
title: 'A Carpet',
description: 'A nice looking, maybe a little bit used carpet.',
price: 15.99,
},
{
id: 'p2',
title: 'A Book',
description: 'You can read it. Maybe you should read it.',
price: 12.99,
},
]);
function addProduct(productData) {
const newProduct = {
id: new Date().toISOString(),
title: productData.title,
description: productData.description,
price: productData.price,
};
products.value.push(newProduct);
}
provide('products', products);
provide('addProduct', addProduct);
},
};
</script>
<style>
* {
box-sizing: border-box;
}
html {
font-family: sans-serif;
}
body {
margin: 0;
}
.container {
margin: 3rem auto;
max-width: 30rem;
border-radius: 12px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
padding: 1rem;
text-align: center;
}
</style>

View File

@ -0,0 +1,53 @@
<template>
<header>
<nav>
<ul>
<li>
<router-link to="/products">All Products</router-link>
</li>
<li>
<router-link to="/products/add">Add Product</router-link>
</li>
</ul>
</nav>
</header>
</template>
<style scoped>
header {
width: 100%;
height: 5rem;
background-color: #570080;
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.26);
}
nav {
height: 100%;
}
ul {
list-style: none;
margin: 0;
padding: 0;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
li {
margin: 0 1rem;
}
a {
text-decoration: none;
color: white;
font-size: 1.25rem;
}
a:hover,
a:active,
a.router-link-active {
color: #fca55e;
}
</style>

View File

@ -0,0 +1,23 @@
import { createApp } from 'vue';
import { createRouter, createWebHistory } from 'vue-router';
import App from './App.vue';
import AllProducts from './pages/AllProducts.vue';
import ProductDetails from './pages/ProductDetails.vue';
import AddProduct from './pages/AddProduct.vue';
const router = createRouter({
history: createWebHistory(),
routes: [
{ path: '/', redirect: '/products' },
{ path: '/products', component: AllProducts },
{ path: '/products/:pid', component: ProductDetails },
{ path: '/products/add', component: AddProduct }
]
});
const app = createApp(App);
app.use(router);
app.mount('#app');

View File

@ -0,0 +1,91 @@
<template>
<section>
<h2>Add a products</h2>
<form @submit.prevent="submitForm">
<div>
<label for="title">Title</label>
<input type="text" id="title" v-model="enteredTitle" />
</div>
<div>
<label for="price">Price</label>
<input type="number" id="price" v-model.number="enteredPrice" />
</div>
<div>
<label for="description">Description</label>
<textarea rows="5" id="description" v-model="enteredDescription"></textarea>
</div>
<button>Add Product</button>
</form>
</section>
</template>
<script>
import { ref, inject } from 'vue';
export default {
setup() {
const addProduct = inject('addProduct');
const enteredTitle = ref('');
const enteredPrice = ref(null);
const enteredDescription = ref('');
function submitForm() {
addProduct({
title: enteredTitle,
description: enteredDescription,
price: enteredPrice,
});
}
return {
enteredTitle,
enteredPrice,
enteredDescription,
submitForm,
};
},
};
</script>
<style scoped>
section {
margin: 3rem auto;
max-width: 40rem;
padding: 1rem;
border-radius: 12px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
}
input,
label,
textarea {
display: block;
width: 100%;
}
label {
font-weight: bold;
}
input,
textarea {
font: inherit;
margin-bottom: 0.5rem;
}
button {
font: inherit;
background-color: #570080;
border: 1px solid #570080;
color: white;
padding: 0.5rem 1.5rem;
cursor: pointer;
}
button:hover,
button:active {
background-color: #220031;
border-color: #220031;
}
</style>

View File

@ -0,0 +1,51 @@
<template>
<section>
<h2>All products</h2>
<ul>
<li v-for="product in products" :key="product.id">
<h3>{{ product.title }}</h3>
<h4>${{ product.price }}</h4>
<p>{{ product.description }}</p>
<router-link to="/products/id">View Details</router-link>
</li>
</ul>
</section>
</template>
<script>
import { inject } from 'vue';
export default {
setup() {
const loadedProducts = inject('products');
return { products: loadedProducts };
},
};
</script>
<style scoped>
section {
margin: 3rem auto;
max-width: 40rem;
padding: 1rem;
border-radius: 12px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
}
ul {
list-style: none;
margin: 0;
padding: 0;
}
li {
margin: 1rem 0;
border: 1px solid #ccc;
padding: 1rem;
}
h3, h4 {
margin: 0.5rem 0;
}
</style>

View File

@ -0,0 +1,32 @@
<template>
<section>
<h2>{{ title }}</h2>
<h3>${{ price}}</h3>
<p>{{ description}}</p>
</section>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const title = ref('');
const price = ref(null);
const description = ref('');
return { title, price, description };
},
};
</script>
<style scoped>
section {
margin: 3rem auto;
max-width: 40rem;
padding: 1rem;
border-radius: 12px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.26);
}
</style>

View File

@ -8,4 +8,4 @@ services:
ports:
- 8080:8080
volumes:
- ./2021-09-04_composition-13-demo-starting-project/:/app
- ./2021-09-06_composition-17-routing-starting-project/:/app