vue3实现一个todo?list

这篇文章主要为大家详细介绍了基于vuejs实现一个todolist项目,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助

vue3实现一个todo?list,久久派带你了解更多相关信息。

目录
  • 功能介绍
  • 相关代码
  • 总结

实现方式不是最优,主要是为了学习vue3的一些新语法以及属性

功能介绍

vue3实现一个todo?list

vue3实现一个todo?list

vue3实现一个todo?list

相关代码

index.vue

<template>  <p class=\"todo-list\">    <el-card class=\"box-card\">      <template #header>        <p class=\"card-header\">          <span>工作计划</span>          <el-button            class=\"button\"            type=\"primary\"            icon=\"el-icon-circle-plus\"            circle            @click=\"handleClickTodo\"          ></el-button>        </p>      </template>      <template v-if=\"list.length > 0\">        <todo-item          v-for=\"(val, index) in list\"          :key=\"index\"          :info=\"val\"        ></todo-item>      </template>      <el-empty v-else description=\"还没有待办的事项~\"></el-empty>    </el-card>    <add-action v-model:visible=\"visible\"></add-action>  </p></template><script>import AddAction from \"./AddTodo.vue\";import TodoItem from \"./Item.vue\";import { reactive, toRefs, provide } from \"vue\";export default {  name: \"todo-list\",  components: { AddAction, TodoItem },  setup() {    const state = reactive({      visible: false,      list: [        {          title: \"1.学习vue3.0\",          time: \"2021-08-20\",          desc: \"1.ppppppppppppp\",          status: false,        },      ],    });    const addTodo = (data) => {      state.list.push(data);    };    const delTodo = (title) => {      state.list = state.list.filter((val) => val.title !== title);    };    const handleClickTodo = () => {      state.visible = true;    };    provide(\"addTodo\", addTodo);    provide(\"delTodo\", delTodo);    return {      handleClickTodo,      ...toRefs(state),    };  },};</script><style>.todo-list {  padding: 100px;}.card-header {  display: flex;  justify-content: space-between;  align-items: center;}.text {  font-size: 14px;}.item {  margin-bottom: 18px;}.box-card {  width: 480px;}</style>

AddTodo.vue

<template>  <el-dialog    title=\"新增待办计划\"    v-model=\"visible\"    width=\"600px\"    @close=\"handleClose\"  >    <el-form      style=\"width: 430px\"      :model=\"form\"      :rules=\"rules\"      label-width=\"120px\"      ref=\"formRef\"    >      <el-form-item label=\"计划名称\" prop=\"title\">        <el-input          v-model=\"form.title\"          placeholder=\"请输入待办计划名称\"        ></el-input>      </el-form-item>      <el-form-item label=\"计划完成时间\" prop=\"time\">        <el-date-picker value-format=\"YYYY/MM/DD\" style=\"width: 100%\" v-model=\"form.time\" type=\"date\" placeholder=\"请选择计划完成时间\">        </el-date-picker>      </el-form-item>      <el-form-item label=\"计划详细描述\" prop=\"desc\">        <el-input          type=\"textarea\"          :rows=\"6\"          v-model=\"form.desc\"          placeholder=\"请输入详细待办计划\"        ></el-input>      </el-form-item>    </el-form>    <template #footer>      <span class=\"dialog-footer\">        <el-button @click=\"visible = false\">取 消</el-button>        <el-button type=\"primary\" @click=\"handleConfirm\">确 定</el-button>      </span>    </template>  </el-dialog></template><script>import { reactive, toRefs, ref, inject } from \"vue\";export default {  name: \"add-todo\",  props: {    visible: {      type: Boolean,      default: false,    },  },  setup(props, { emit }) {    const formRef = ref(null)    const addTodo = inject(\'addTodo\')    const state = reactive({      form: {        title: \"\",        desc: \"\",        time: \"\",        status: false      },      rules: {        title: [          { required: true, message: \'请输入待办计划名称\', trigger: [\'blur\']}        ],        time: [          { required: true, message: \'请选择待办计划时间\', trigger: [\'change\']}        ],        desc: [          { required: true, message: \'请输入详细待办计划\', trigger: [\'blur\']}        ]      },    });    const handleClose = () => {      emit(\"update:visible\", false);      formRef.value.clearValidate()      formRef.value.resetFields()    };    const handleConfirm = () => {      formRef.value.validate(valid => {        if (valid) {          addTodo(JSON.parse(JSON.stringify(state.form)))          handleClose()        }      })    }    return {      formRef,      ...toRefs(state),      handleClose,      handleConfirm    };  },};</script>

Item.vue

<template>  <p class=\"todo-item\">    <p class=\"titme-box\">      <el-checkbox v-model=\"info.status\" @click=\"change\"></el-checkbox>      <h3 :class=\"info.status ? \'success\' : \'\'\">{{ info.title }}</h3>    </p>    <p class=\"del\">      <p class=\"time\" :class=\"info.status ? \'success\' : \'\'\">{{ info.time }}</p>      <el-button        type=\"danger\"        icon=\"el-icon-delete\"        circle        size=\"mini\"        @click=\"handleDelTodo\"      ></el-button>    </p>  </p></template><script>import { inject } from \"vue\";export default {  name: \"todo-item\",  props: {    info: {      type: Object,      default: () => ({}),    },  },  setup(props) {    const delTodo = inject(\"delTodo\");    const handleDelTodo = () => {      delTodo(props.info.title);    };    return {      handleDelTodo,    };  },};</script><style lang=\"scss\">.todo-item {  display: flex;  align-items: center;  justify-content: space-between;  border-bottom: 1px solid rgb(229, 226, 226);  height: 45px;  line-height: 45px;  .success {    text-decoration: line-through;  }  .titme-box {    display: flex;    align-items: center;    h3 {      padding-left: 12px;      font-size: 16px;    }  }  .del {    display: flex;    align-items: center;    .time {      width: 100px;      font-size: 14px;    }  }}</style>

vue3实现一个todo?list

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注趣讯吧的更多内容!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/16750.html

(0)
nan
上一篇 2021-08-23
下一篇 2021-08-23

相关推荐

发表回复

登录后才能评论