Vue3.0 composition-api 实战

232 阅读1分钟
<template>
  <div class="common-layout">
    <el-container>
      <el-header>TODOLIST</el-header>
      <el-main>
        <div> 共有{{list.length}}个任务,完成的{{finish.length}}件</div>
        <div class="listWarp">
          <div>未完成的列表</div>
          <ul class="warp">
            <div v-for="(item,index) in list" :key="index" >
              <li class="item" v-if='!item.checked'  > 
              <el-checkbox v-model="item.checked" ></el-checkbox>
              <div @dblclick="edit(item,index)"  v-if="!item.isEdit">{{item.text}}</div>
              <el-input v-else v-model="inputValue" size="mini" @blur="editEnter(item,index)"/>
             <el-icon :size="15" > 
               <Close @click="del(index)"/>
              </el-icon>
             </li>
            </div>
          </ul>
        </div>
        <div class="listWarp">
          <div>完成的列表</div>
          <ul class="warp" >
            <li class="item" v-for="(item,index) in finish" :key="'finished' + index" > 
              <el-checkbox v-model="item.checked" :disabled='true'></el-checkbox>
              <div>{{item.text}}</div>
             </li>
          </ul>
        </div>
        <div class="listWarp">
          <div class="warp">
            <div>添加新任务</div>
           <el-input v-model="input" placeholder="请输入新任务" />

            <el-button type="primary" @click="add" >
                 添加
                 <el-icon class="el-icon--right">
                  <Plus />
                 </el-icon>
             </el-button>
         
          </div>
          
        </div>
        
      </el-main>
    </el-container>

  
  </div>
</template>
<script>
import { ref,reactive,toRefs,computed } from "vue";

import { Close,Plus } from '@element-plus/icons'
import { ElMessage } from 'element-plus'
export default {
  components: {
        Close,
        Plus,
      
    },
  setup(props,ctx) {
    console.log(props, ctx ,'上下文')
    const input = ref('')
    const inputValue = ref('')
    const curIndex = ref(0)
    //查询
    const dataList = reactive({
      list:[{
        checked:false,
        text:'萝卜',
        isEdit:false

      },{
        checked:false,
        text:'白菜',
        isEdit:false

      }
      ],

      finish:computed(()=>
        dataList.list.filter((item)=>
          { return item.checked == true}
        ))

    })
   //添加
   const add=()=>{
     if(input.value ==''){
       ElMessage.warning("新任务不能为空!");
     } else{
        dataList.list.push({
          checked:false,
          text:input.value,
          isEdit:false
        })
        ElMessage.success("添加成功!");
        input.value = ''
     }
       
      }
      //删除
      const del=(index)=>{
        dataList.list.splice(index,1)
      }
     //编辑
      const edit =(item,index)=>{
        item.isEdit = true
        inputValue.value = item.text
        curIndex.value = index
       
      }
      const editEnter=(item)=>{
       
        // vue 2.0 是不行的
          dataList.list[curIndex.value]={
           text:inputValue.value,
           checked:false,
           isEdit:false
         }
          
      }
  
    return {
      ...toRefs(dataList),
      input,
      add,
      del,
      edit,
      inputValue,
      editEnter
    }
    
  }
  
}

</script>



<style lang="less">
.el-header{
  background-color: #cccccc;
  line-height: 60px;  
}
.el-main{
background-color: aliceblue;
height: 600px;
}
.el-input{
  margin: 10px 0 10px 20px
  
}
.listWarp{
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  
}
.warp{
  list-style: none;
   width: 400px;
  .item{
    height: 30px;
    padding: 0 10px ;
    margin-top: 5px;
    display: flex;
  justify-content: space-between;
  align-items: center;
  border: 1px solid #cccccc
    
  }
}
</style>