坚持打卡学习第一天!!!

vue01

创建项目

  1. 命令行工具 npm i -g @vue/cli version 3.x
  2. 创建 vue create vue-test
  3. 运行 npm run serve
  4. 创建 npm run build

数据绑定

	插值绑定
	{{title}}
	属性绑定
	<p :title="title">

条件和循环

	v-if
	v-for="item in items"

用户输入

<input type="text" v-model="text">
<button @click="addGood">添加商品</button>
methods: {
	addGood() {
		if (this.text) {
			this.goods.push({
				id: this.goods.length + 1,
				text: this.text,
				price: 1000
			});
			this.text = "";
		}
	}
}

组件通信

父->子组件   props
	// 父组件
	<cart title="title"/>
	// 子组件
	{
		props: ['title']
	}

子->父组件   $emit
	// Cart.vue
	<button @click="$emit('add', c)">+</button>
	// App.vue
	<Cart ... @add="cartAdd($event)"></Cart>
	cartAdd(item) {
		console.log(item.text + "加一个");
	}

动态样式

<tr ... :class="{inactive:!c.active}">

计算属性

computed: {
	total() {
		//计算激活项总价
		return this.cart.reduce((sum, c) => {
			if (c.active) {
				sum += c.price * c.count;
			}
			return sum;
		}, 0);
	}
}

监听数据变化 watch

data() {
		return {
			cart: JSON.parse(localStorage.getItem("cart")) || []
		};
	},
	watch: {
		cart(n) {
			localStorage.setItem("cart", JSON.stringify(n));
		}
}

深度监听

	watch: {
		cart: {
			handler(n) {
				localStorage.setItem("cart", JSON.stringify(n));
			},
			deep: true
		}
	}

组件设计:实现Form、FormItem、Input

Input

<template>
	<div>
		<input :type="type" :value="value" @input="onInput">
	</div>
</template>
<script>
export default {
	props: {
		type: {
			type: String,
			default: "text"
		},
		value: {
			type: String,
			default: ""
		}
	},
	methods: {
		onInput(e) {
			// 通知父组件发生了input事件
			this.$emit("input", e.target.value);
			// 通知FormItem校验
			this.$parent.$emit("validate");
			}
		}
	};
</script>

FormItem

	<template>
		<div>
			<label v-if="label">{{label}}</label>
			<!-- 插槽 -->
			<slot></slot>
			<!-- 校验错误信息 -->
			<p v-if="errorMessage" class="error">{{errorMessage}}</p>
		</div>
	</template>
	<script>
	import Validator from "async-validator";
	import { Promise } from "q";
	export default {
		inject: ["form"],
		props: ["label", "prop"],
		data() {
			return {
				errorMessage: ""
			};
		},
		created() {
			this.$on("validate", this.validate);
		},
		methods: {
			validate() {
				return new Promise(resolve => {
					// 校验规则制定
					const descriptor = { [this.prop]: this.form.rules[this.prop]};
					// 创建校验器
					const validator = new Validator(descriptor);
					// 执行校验
					validator.validate(
						{ [this.prop]: this.form.model[this.prop] },
						errors => {
							if (errors) {
								// 显示错误信息
								this.errorMessage = errors[0].message;
								resolve(false);
							} else {
								this.errorMessage = "";
								resolve(true);
							}
						}
					);
				});
			}
		}
	};
	</script>
<style scoped>
	.error {
			color: red;
	}
</style>

Form

<template>
	<div>
		<slot></slot>
	</div>
</template>
<script>
export default {
	// provide返回对象可以跨层级传参给子孙
	provide() {
		return {
			form: this // 表单实例传递给后代
		};
	},
	props: {
		model: { type: Object, required: true },
		rules: { type: Object }
	},
	methods: {
		async validate(cb) {
			// 执行表单中所有表单项校验
			const tasks = this.$children
				.filter(item => item.prop)
				.map(item => item.validate());
			// tasks中任意false就校验失败
			const results = await Promise.all(tasks);
			if (results.some(valid => !valid)) {
				// 校验失败
				cb(false);
			} else {
				cb(true);
			}
		}
	}
};
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值