<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
<div>
<button v-for="tab in tabs" :key="tab" @click="activeTab = tab">
{{ tab }}
</button>
</div>
<div v-if="activeTab === 'Tab 1'">
Content of Tab 1
</div>
<div v-if="activeTab === 'Tab 2'">
Content of Tab 2
</div>
<div v-if="activeTab === 'Tab 3'">
Content of Tab 3
</div>
</div>
<script>
new Vue({
el: '#app',
data: {
tabs: ['Tab 1', 'Tab 2', 'Tab 3'],
activeTab: 'Tab 1'
}
})
</script>
</body>
</html>
项目描述:
在这个应用中,用户可以添加待办事项、标记完成以及删除待办事项。会使用到 v-for
来循环渲染待办事项,v-if
和 v-else
来控制待办事项是否显示为完成。
<!DOCTYPE html>
<html>
<head>
<title>Vue.js To-Do List</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
<input type="text" v-model="newTask" @keyup.enter="addTask"/>
<button @click="addTask">Add</button>
<ul>
<li v-for="(task, index) in tasks" :key="index">
<span v-if="task.completed" @click="toggleCompletion(index)" style="text-decoration: line-through;">{{ task.name }}</span>
<span v-else @click="toggleCompletion(index)">{{ task.name }}</span>
<button @click="removeTask(index)">Delete</button>
</li>
</ul>
</div>
<script>
new Vue({
el: '#app',
data: {
newTask: '',
tasks: [
{ name: 'Buy milk', completed: false },
{ name: 'Go to the gym', completed: false },
]
},
methods: {
addTask() {
if(this.newTask === '') return;
this.tasks.push({ name: this.newTask, completed: false });
this.newTask = '';
},
removeTask(index) {
this.tasks.splice(index, 1);
},
toggleCompletion(index) {
this.tasks[index].completed = !this.tasks[index].completed;
}
}
});
</script>
</body>
</html>
v-model
绑定了一个新任务的输入字段。v-for
循环渲染每一个任务。v-if
和 v-else
控制任务显示为已完成或未完成。@click
和 `@keyup.enter` 添加了点击和键盘事件。项目描述:
用户可以选择产品添加到购物车。使用 v-for
渲染产品列表,使用 v-on
监听添加到购物车的操作。
<!DOCTYPE html>
<html>
<head>
<title>Vue.js Shopping Cart</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
<h1>Product List</h1>
<ul>
<li v-for="(product, index) in products" :key="index">
{{ product.name }} - ${{ product.price }}
<button @click="addToCart(index)">Add to Cart</button>
</li>
</ul>
<h1>Your Cart</h1>
<ul>
<li v-for="(item, index) in cart" :key="item.id">
{{ item.name }} - ${{ item.price }} x {{ item.quantity }}
</li>
</ul>
<p>Total: ${{ total }}</p>
</div>
<script>
new Vue({
el: '#app',
data: {
products: [
{ id: 1, name: 'Apple', price: 1.2 },
{ id: 2, name: 'Banana', price: 0.9 },
{ id: 3, name: 'Cherry', price: 2.5 }
],
cart: []
},
computed: {
total() {
return this.cart.reduce((acc, item) => acc + (item.price * item.quantity), 0).toFixed(2);
}
},
methods: {
addToCart(index) {
const product = this.products[index];
const found = this.cart.find(item => item.id === product.id);
if (found) {
found.quantity++;
} else {
this.cart.push({ ...product, quantity: 1 });
}
}
}
});
</script>
</body>
</html>
v-for
来循环渲染产品列表和购物车列表。@click
(这实际上是 v-on:click
的缩写)来监听“添加到购物车”的按钮点击事件。addToCart
中,根据产品 ID 检查该产品是否已经在购物车中。如果在,就增加数量;如果不在,就添加到购物车。total
来计算购物车的总价。在 Vue 中,表单修饰符是一些特殊的指令后缀,用于帮助你以方便的方式处理用户输入。这些修饰符通常用于 v-model
指令中,并可以轻松处理用户输入的格式和行为。以下是 Vue 中常用的一些表单修饰符:
.lazy
在默认情况下,v-model
会在每次 input
事件触发后立即更新值。如果你使用 .lazy
修饰符,那么它会在 change
事件上而不是 input
事件上进行同步。
<!-- 使用 .lazy 修饰符 -->
<input v-model.lazy="message" />
.number
该修饰符会尝试将用户的输入值转换为数值类型。这是有用的,因为 HTML 表单字段的值通常都是字符串。
<!-- 使用 .number 修饰符 -->
<input v-model.number="age" type="number">
.trim
该修饰符会去除用户输入的前后空格。
<!-- 使用 .trim 修饰符 -->
<input v-model.trim="username" />
多个修饰符
你也可以组合使用多个修饰符。
<!-- 使用多个修饰符 -->
<input v-model.trim.lazy="email" />
自定义修饰符
Vue 不支持直接创建自定义的表单修饰符,但你通常可以通过计算属性或者方法实现同样的效果。
使用这些修饰符可以让你的表单处理逻辑更为简单和清晰。需要注意的是,这些修饰符只影响 v-model
的行为,不会改变其他指令或原生 DOM 事件的行为。
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/vue@2.6.14/dist/vue.js"></script>
<style>
#app {
display: flex;
justify-content: center;
flex: 1;
}
</style>
</head>
<body>
<div id="app">
<form @submit.prevent="submitForm" style="width:15%">
<label>全名:</label>
<input type="text" v-model.lazy.trim="form.name"><br/>
<label>邮箱:</label>
<input type="email" v-model.trim="form.email"><br/>
<label>密码:</label>
<input type="password" v-model="form.password"><br/>
<label>年龄:</label>
<input type="number" v-model.number="form.age"><br/>
<label>性别:</label>
<input type="radio" id="man" value="man" v-model="form.gender">
<label for="man">男</label>
<input type="radio" id="female" value="female" v-model="form.gender">
<label for="female">女</label><br/>
<label>国家:</label>
<select v-model="form.country">
<option v-for="country in COUNTRIES" :value="country.value" :key="country.value">{{ country.title }}</option>
</select><br/>
<label>爱好:</label>
<template v-for="hobby in HOBBIES" :key="hobby.value">
<input type="checkbox" :id="hobby.value" :value="hobby.value" v-model="form.hobbies">
<label :for="hobby.value">{{hobby.title}}</label>
</template><br/>
<label>简介:</label>
<textarea v-model="form.bio"></textarea><br/>
<button type="submit">注册</button>
</form>
<div style="width:15%">
<p>全名: {{ form.name }}</p>
<p>邮箱: {{ form.email }}</p>
<p>密码: {{ form.password }}</p>
<p>年龄: {{ form.age }}</p>
<p>性别: {{ form.gender }}</p>
<p>国家: {{ form.country }}</p>
<p>爱好: {{ form.hobbies.join(', ') }}</p>
<p>简介: {{ form.bio }}</p>
</div>
</div>
<script>
const COUNTRIES = [
{ value: 'cn', title: '中国' },
{ value: 'us', title: '美国' },
{ value: 'uk', title: '英国' }
];
const HOBBIES = [
{ value: 'football', title: '足球' },
{ value: 'basketball', title: '篮球' },
{ value: 'baseball', title: '棒球' }
]
new Vue({
el: '#app',
data: function
() {
return {
HOBBIES,
COUNTRIES,
form: {
name: '',
email: '',
password: '',
gender: 'man',
country: 'cn',
hobbies: [],
bio: '',
age: 18,
},
checkAll: false,
isIndeterminate: true,
}
},
methods: {
submitForm() {
console.log(this.form);
}
}
})
</script>
</body>
</html>