Vue增删改查【升级版】

前言

重新温习vue,练手的一个功能。不多说,自己研究。


演示

扩展

vue第一种实现全选/反选方式

纯JS+HTML简单表格增删改查

vue第二种实现全选/反选方式

<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title></title>
		<script src="https://cdn.bootcss.com/vue/2.5.21/vue.js"></script>
		<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.3/css/bootstrap.min.css" rel="stylesheet">
	</head>
	<style>
		div {
			padding: 0px;
			margin: 30px;
		}
		
		[v-clock] {
			display: none;
		}
	</style>

	<body>
		<div id="app">
			<table border="1" cellpadding="0" cellspacing="0">
				<tr>
					<!-- 用户注册信息 -->
					<td colspan="2" align="center">{
   
   {orderCategories.message}}</td>
				</tr>
				<tr>
					<!-- 用户名 -->
					<td>{
   
   {orderCategories.userName}}</td>
					<td>
						<input type="text" id="user" v-model="orderTemplate.userName" />
					</td>
				</tr>
				<tr>
					<!-- 密码 -->
					<td>{
   
   {orderCategories.passWord}}</td>
					<td>
						<input type="password" id="password" v-model="orderTemplate.passWord" />
					</td>
				</tr>
				<tr>
					<!-- 电话号码 -->
					<td>{
   
   {orderCategories.telNumber}}</td>
					<td>
						<input type="text" id="telNumber" v-model="orderTemplate.telNumber" />
					</td>
				</tr>
				<tr>
					<!-- 业务 -->
					<td>{
   
   {orderCategories.business}}</td>
					<td>
						<template v-for="(item,index) in businessCategory.businessList">
							<input type="radio" :name="item.name" :value="item.business" v-model="orderTemplate.business" />
							<label :for="item.business">{
   
   {item.business}}</label>
						</template>
					</td>
				</tr>
				<tr>
					<!-- 籍贯 -->
					<td>{
   
   {orderCategories.nativePlace}}</td>
					<td>
						<select v-model="cityCategory.citys" @change="changeProduct($event)">
							<option v-for="(item,index) in cityCategory.cityList" :value="item.id" :key="index">{
   
   {item.city}}</option>
						</select>
					</td>
				</tr>
				<tr>
					<!-- 兴趣 -->
					<td>{
   
   {orderCategories.interests}}</td>
					<td>
						<template v-for="(item,index) in interestCategory.interestList">
							<input type="checkbox" :name="item.name" :value="item.interest" ref="interestChecks" v-model="item.check" />
							<label :for="item.interest">{
   
   {item.interest}}</label>
						</template>
					</td>
				</tr>
				<tr>
					<!-- 政治面貌 -->
					<td>{
   
   {orderCategories.politicsFace}} </td>
					<td>
						<template v-for="(item,index) in identityCategory.identityList">
							<input type="radio" :name="item.name" :value="item.identity" v-model="orderTemplate.politicsFace" />
							<label :for="item.identity">{
   
   {item.identity}}</label>
						</template>
					</td>
				</tr>
				<tr>
					<td colspan="2" align="center">
						<input type="button" v-show="flag" value="提交" @click="submit" id="submit" />
						<input type="button" v-show="!flag" value="修正" @click="modifyIndex" id="modifyIndex" />
						<input type="button" value="重置" @click="reset" id="reset" />
						<input type="button" v-show="!flag" value="取消修正" @click="cancelModifyIndex" id="cancelModifyIndex" />
					</td>
				</tr>
			</table>
			<input type="hidden" :value="userId">
			<br /><br />

		</div>
		<orders></orders>
		<div id="app2">
			<template id="order">
				<input type="hidden" v-bind:orderHandlesProps="orderHandles" v-bind:orderCategoriesProps="orderCategories" v-bind:orderDetailedProps="orderDetailed"/>
				<table border="1" cellspacing="0" cellpadding="0">
					<tr>
						<td>
							<input type="checkbox" id="all" v-model="orderHandles.checked" @change="checkAll" />
							<!-- 全选 -->
							<label for="all">{
   
   {orderHandles.selectAll}}</label>
						</td>
						<td colspan="6" align="center">
							<input type="button" :disabled="someDisabled" :value="orderHandles.delRowButton" @click="delRow" />
						</td>
					</tr>
					<tr>
						<!-- 选中 -->
						<th>
							{
   
   {orderHandles.select}}
						</th>
						<!-- 用户名 -->
						<th>{
   
   {orderCategories.userName}}</th>
						<!-- 密码 -->
						<th>{
   
   {orderCategories.passWord}}</th>
						<!-- 电话号码 -->
						<th>{
   
   {orderCategories.telNumber}}</th>
						<!-- 业务 -->
						<th>{
   
   {orderCategories.business}}</th>
						<!-- 籍贯 -->
						<th>{
   
   {orderCategories.nativePlace}}</th>
						<!-- 兴趣 -->
						<th>{
   
   {orderCategories.interests}}</th>
						<!-- 政治面貌 -->
						<th>{
   
   {orderCategories.politicsFace}}</th>
						<!-- 操作 -->
						<th>{
   
   {orderHandles.caoZuo}}</th>
					</tr>
					<template v-for="(item,index) in orderDetailed">
						<tr>
							<td>
								<input type="checkbox" v-model="item.checkModel" :id="['order-'+index]" :key="item.index" @change="checkBox(item)" />
							</td>
							<td>
								{
   
   {item.userName}}
							</td>
							<td>
								{
   
   {item.passWord}}
							</td>
							<td>
								{
   
   {item.telNumber}}
							</td>
							<td>
								{
   
   {item.business}}
							</td>
							<td>
								{
   
   {item.nativePlace}}
							</td>
							<td>
								{
   
   {item.interests}}
							</td>
							<td>
								{
   
   {item.politicsFace}}
							</td>
							<td>
								<input type="button" :disabled="someDisabled" :value="orderHandles.delButton" @click="del(index)" />
								<input type="button" :value="orderHandles.updateButton" @click="modify(index)" />
							</td>
						</tr>
					</template>
				</table>
			</template>
		</div>
	</body>
	<script>
		// 订单类别
		var orderCategory = {
			message: '用户注册信息',
			userName: '用户名',
			passWord: '密码',
			nativePlace: '籍贯',
			interests: '兴趣',
			politicsFace: '政治面貌',
			telNumber: '电话号码',
			business: '业务'
		}

		// 订单操作
		var orderHandle = {
			// 选中的集合
			checkedList: [],
			selectAll: '全选',
			delRowButton: '选中删除',
			delButton: '删除',
			updateButton: '修改',
			select: '选中',
			caoZuo: '操作',
			// 全选/反选
			checked: false
		}
		// 订单详细
		var orderDetailed = [{
			userName: '007',
			passWord: '1234567',
			telNumber: '080111111111',
			business: 'vip',
			nativePlace: '浙江',
			interests: '书法,绘画,瑜伽',
			politicsFace: '团员'
		}]

		// 订单
		var orderTemplate = {
			userName: '',
			passWord: '',
			telNumber: '',
			business: '',
			nativePlace: '',
			interests: '',
			politicsFace: ''
		}

		// 城市类别
		var cityCategory = {
			citys: '0',
			cityList: [{
					id: 0,
					city: '请选择'
				},
				{
					id: 1,
					city: '浙江'
				},
				{
					id: 2,
					city: '上海'
				},
				{
					id: 3,
					city: '重庆'
				},
				{
					id: 4,
					city: '北京'
				}
			]
		}

		// 兴趣类别
		var interestCategory = {
			interestList: [{
					interest: '篮球',
					name: 'basketball',
					check:false
				},
				{
					interest: '足球',
					name: 'football',
					check:false
				},
				{
					interest: '书法',
					name: 'calligraphy',
					check:false
				},
				{
					interest: '音乐',
					name: 'music',
					check:false
				},
				{
					interest: '绘画',
					name: 'painting',
					check:false
				},
				{
					interest: '散打',
					name: 'Sanda',
					check:false
				},
				{
					interest: '瑜伽',
					name: 'yoga',
					check:false
				},
				{
					interest: '其他',
					name: 'other',
					check:false
				}
			]
		}

		// 政治面貌类别
		var identityCategory = {
			identityList: [{
					identity: '党员',
					name: 'dangYuan'
				},
				{
					identity: '团员',
					name: 'tuanYuan'
				},
				{
					identity: '群众',
					name: 'qunZhong'
				}
			]
		}

		// 业务类别
		var businessCategory = {
			businessList: [{
					name: 'ordinary',
					business: '平民'
				},
				{
					name: 'vip',
					business: 'vip'
				},
				{
					name: 'svip',
					business: 'svip'
				}
			]
		}

		var app = new Vue({
			el: '#app',
			data: {
				// 订单类别
				orderCategories: orderCategory,
				// 城市类别
				cityCategory: cityCategory,
				// 兴趣类别
				interestCategory: interestCategory,
				// 政治面貌类别
				identityCategory: identityCategory,
				// 业务类别
				businessCategory: businessCategory,
				// 订单详细
				orderDetailed: orderDetailed,
				// 用户填写的订单
				orderTemplate: orderTemplate,
				flag:true,
				// 需要修正的用户id
				userId:''
			},
			methods: {
				// 提交
				submit() {
					// 存放选中的业务
					var interestsArr = []
					var interestCheckList = this.$refs.interestChecks
					for(var i = 0; i < interestCheckList.length; i++) {
						if(interestCheckList[i].checked) {
							interestsArr.push(interestCheckList[i].value)
						}
					}
					var orderInterestsArr = interestsArr
					this.orderTemplate.interests = orderInterestsArr.join(',')
					var order = {
						userName: this.orderTemplate.userName,
						passWord: this.orderTemplate.passWord,
						telNumber: this.orderTemplate.telNumber,
						business: this.orderTemplate.business,
						nativePlace: this.orderTemplate.nativePlace,
						interests: this.orderTemplate.interests,
						politicsFace: this.orderTemplate.politicsFace
					}
					this.orderDetailed.push(order)
					app.reset()
					alert("提交成功!")
				},
				// 重置 
				reset() {
					this.orderTemplate.userName = ''
					this.orderTemplate.passWord = ''
					this.orderTemplate.telNumber = ''
					this.orderTemplate.business = ''
					this.orderTemplate.politicsFace = ''
					this.cityCategory.citys = '0'
					var interestCheckList = this.$refs.interestChecks
					for(var i = 0; i < interestCheckList.length; i++) {
						interestCheckList[i].checked = false
					}
					this.interestCategory.interestList.forEach(item => {
						item.check =false;
					})
					// 变更按钮状态
					app.flag = true
				},
				changeProduct(event) {
					var index = event.target.value;
					this.orderTemplate.nativePlace = cityCategory.cityList[index].city; //获取option对应的value值
				},
				modifyIndex(){
					// 要修改的用户
					var index=this.userId
					// 修改的数据替换为提交的数据
					var interestsArr = []
					var interestCheckList = this.$refs.interestChecks
					for(var i = 0; i < interestCheckList.length; i++) {
						if(interestCheckList[i].checked) {
							interestsArr.push(interestCheckList[i].value)
						}
					}
					var cityId = this.cityCategory.citys
					var orderInterestsArr = interestsArr
					this.orderTemplate.interests = orderInterestsArr.join(',')
					this.orderDetailed[index].userName = this.orderTemplate.userName,
					this.orderDetailed[index].passWord = this.orderTemplate.passWord,
					this.orderDetailed[index].telNumber = this.orderTemplate.telNumber,
					this.orderDetailed[index].business = this.orderTemplate.business,
					this.orderDetailed[index].politicsFace = this.orderTemplate.politicsFace,
					this.orderDetailed[index].nativePlace = this.cityCategory.cityList[cityId].city,
					this.orderDetailed[index].interests = this.orderTemplate.interests
					// 变更按钮状态
					app.flag = true
					// 修改成功,清空表提交的数据
					app.reset();
					// 删除按钮活性
					app2.someDisabled = false
					alert('修正成功!')
				},
				// 取消修正
				cancelModifyIndex() {
					// 删除按钮活性
					app2.someDisabled = false
					console.log(app2.someDisabled)
					// 提交按钮活性
					flag = true
					// 重置
					app.reset();
					alert('取消修正成功!')
				},
			}

		});

		var app2 = new Vue({
			el: "#app2",
			data: {
				// 订单类别
				orderCategories: orderCategory,
				// 订单操作
				orderHandles: orderHandle,
				// 订单详细
				orderDetailed: orderDetailed,
				// 删除按钮非活性
				someDisabled : false,
				// 选中多选框默认不选中
				isChecked : false
			},
			methods: {
				// 全选
				checkAll() {
					var vm = this
					if(vm.orderHandles.checked) {
						vm.orderDetailed.forEach((item) => {
							item.checkModel = true
						})

					} else {
						vm.orderDetailed.forEach((item) => {
							item.checkModel = false
						})
					}
				},
				checkBox(item) {
					// 1.获取总复选框数量
					// 2.循环遍历选中的总数大于等于list
					if(this.orderDetailed.every(item => item.checkModel)) {
						// 3.全选按钮选中
						this.orderHandles.checked = true
					} else {
						// 4.全选按钮不选中
						this.orderHandles.checked = false
					}
				},
				// 多个删除
				delRow() {
					// 如果一个删除的订单都没有的场合
					if(!app2.select()){
						// 提示没有可删除的订单
						alert('没有可删除的订单,请重试!');
					}else{
						// 不处理
					}
				},
				// 单个删除
				del(id) {
			         this.orderDetailed.splice(id, 1)
				},
				// 修改回显
				modify(index) {
					// 重置
					app.reset();
					// 赋值
					orderTemplate.userName = orderDetailed[index].userName
					orderTemplate.passWord = orderDetailed[index].passWord,
					orderTemplate.telNumber = orderDetailed[index].telNumber,
					orderTemplate.business = orderDetailed[index].business,
					orderTemplate.politicsFace = orderDetailed[index].politicsFace
					var natives = orderDetailed[index].nativePlace
					cityCategory.cityList.forEach(item => {
						if(item.city == natives) {
							cityCategory.citys = item.id
						} else {

						}
					})
					// 获取要修正的兴趣
					var arr= orderDetailed[index].interests.split(",")
					interestCategory.interestList.forEach(item => {
						if(arr.filter(_item=> _item === item.interest).length>0){
							item.check =true;
						}else{
							
						}
					});
					// 变更按钮状态
					app.flag = false
					// 传递修正的第几条数据
					app.userId = index
					// 删除非活性
					this.someDisabled = true
				},
				// 复选框是否选中
				select() {
					var flg = false
					for(var i=0;i<this.orderDetailed.length;i++){
				 		if(this.orderDetailed[i].checkModel === true){
			 				// 删除对应订单
			 				this.orderDetailed.splice(i, 1)
			 				flg = true
				 		}else{
				 			// 不处理
				 		}
				 	}
					return flg;
				}
			},
			components: {

				props: {
					// 检查类型
					orderCategoriesProps: Object,
					orderHandlesProps: Object,
					orderDetailedProps: Object
				},
				orders: {
					template: '#order'
				},
				methods: {

				}
			},
			watch: {
				// 当全选按钮选中后,提交或者修改新的订单数据
				// 全选按钮监听到数组变化,自动取消全选选中
				orderDetailed: {
				    handler: function(val, oldVal) {
				    	// 初始化复选框未选择的场合,或者状态变更后的复选框未选中
				    	var arr = []
				    	oldVal.forEach(item =>{
				    		if(typeof item.checkModel === "undefined" || item.checkModel === false){
				    			// 没有选中的复选框计数
				    			arr.push(item.checkModel)
				    		}else{
				    			// 不处理
				    		}
				    	});
				    	//当新选中的选择框的总个数等于后台全部数据时,全选框选中,否则不选
				    	// 并且有选中的复选框
				       if (val.length === this.orderDetailed.length && arr.length <= 0) {
				       		// 全选框选中
				            this.orderHandles.checked = true;
				       } else {
				       		// 全选框不选中
				            this.orderHandles.checked = false;
				       }
				     },
				     deep: true
			   },
				
			}
		})
	</script>

</html>

猜你喜欢

转载自blog.csdn.net/qq_41520636/article/details/113922991