vue3.0 手写一个表单提交

通过这人 可以了解vue3 和ts的很多属性 例如:

1.vue3没有了filter属性 用computed代替

2.props传参用type 接收控制数据类型

3.定义数组对象,以及使用生命周期

<script setup lang="ts">
import { ref,reactive,computed,onMounted, nextTick,onBeforeUpdate  } from 'vue'
type HeaderProps = { 
  dataToSon: object[];
  msg:string
};
interface Pro  {
	id: number,
	age: string,
  name:string,
  major:string,
  graduate:string
}

defineProps<HeaderProps>();
const count = ref(0)
let arrPro:{data:Pro[]} = reactive({data:[]})
let objPro = reactive({id:0,name:"",age:"",major:"", graduate:""})
onMounted(()=>{
  let obj:any = sessionStorage.getItem('arrPro')
  let arr  = JSON.parse(obj)
  arrPro.data?arrPro.data = arr.data:arrPro
  // if(arr.data.length){
  //   nextTick(()=>{
  //     console.log(arrPro)
  //   })
  // }
})
onBeforeUpdate(()=>{
  sessionStorage.setItem('arrPro',JSON.stringify(arrPro))
})
const setPro = ()=>{
  objPro.id = Date.now()
  arrPro.data.push(objPro)
  // sessionStorage.setItem('arrPro',JSON.stringify(arrPro))
  objPro={id:0,name:"",age:"",major:"", graduate:""}
}
const getCent = (e:any)=>{
  objPro.graduate=  e.target.value
}
const delpro = (id:number)=>{
  // arrPro = arrPro.filter(item=>item.id != id)
  arrPro.data.map((item,index)=>{
    if(item.id == id){
      arrPro.data.splice(index,1)
    }
  })
  console.log(arrPro,'arr')
  
  sessionStorage.setItem('arrPro',JSON.stringify(arrPro))
}
const formetage = computed(()=>{
  return function(age:string){
    if(age==='1'){
      return '男'
    }else{
      return '女'
    }
      }
})
</script>

<template>
  <p>{{ msg }}</p>

  <div class="card">
      姓 名: <input type="text"  v-model="objPro.name" />
      <br>
      性 别: <input type="text" v-model="objPro.age" />
      <br>
      专 业: <input type="text"  v-model="objPro.major" />
      <br>
      毕业时间: <select @change="getCent">
                  <option value="2023">2023</option>
                  <option value="2022">2022</option>
                  <option value="2021">2021</option>
                  <option value="2020">2020</option>
                  <option value="2019">2019</option>
                </select>
      <br><br>
      <button  @click="setPro" >go on</button>
    
  </div>
  <div>
    <table width="800" align="center">
			<thead>
				<tr>
					<th>姓 名</th>
					<th>性 别</th>
					<th>专 业</th>
					<th>毕业时间</th>
          <th>操 作</th>
				</tr>
			</thead>
			<tbody v-if="arrPro.data.length">
        <tr v-for="(item,index) in arrPro.data" :key="index">
          <td>{{item.name}}</td>
          <td>{{formetage(item.age)}}</td>
          <td>{{item.major}}</td>
          <td>{{item.graduate}}</td>
          <td @click="delpro(item.id)"><span class="del">删除</span></td>
        </tr>
			</tbody>
		</table>
  </div>
</template>

<style scoped>
@import './index.css';
.read-the-docs {
  color: #888;
}
input{
  margin: 10px 5px;
  height: 20px;
}
</style>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值