首页 > 其他分享 >vue3+vant4+vuex4实现todolist备忘录案例

vue3+vant4+vuex4实现todolist备忘录案例

时间:2023-06-05 20:23:08浏览次数:35  
标签:function todolist items content item vant4 vue3 commit store

案例图片如下:

 

 

 1     <van-cell-group>
 2       <van-cell>
 3         <van-row>
 4           <van-col span="20">
 5             <van-field
 6               :value="content"
 7               @change="handleChange"
 8               placeholder="请输入内容"
 9             />
10           </van-col>
11           <van-col span="4">
12             <van-button type="primary" @click="onClickAdd" size="small"
13               >添加</van-button
14             >
15           </van-col>
16         </van-row>
17       </van-cell>
18       <van-cell v-for="(item, index) in listItem" :key="index">
19         <van-row class="bg flex">
20           <van-col span="2">
21             <van-checkbox
22               v-model="item.checked"
23               shape="square"
24               @change="onChange(item, index, $event)"
25             >
26             </van-checkbox>
27           </van-col>
28           <van-col span="16">
29             <div v-if="!item.checked" class="name">{{ item.name }}</div>
30             <van-field v-else v-model="item.name" placeholder="请输入内容" />
31           </van-col>
32           <van-col span="4">
33             <span @click="onClickDelete(item, index)" class="fontColor"
34               >删除</span
35             >
36           </van-col>
37         </van-row>
38       </van-cell>
39       <van-empty
40         v-if="listItem.length == 0"
41         image="https://fastly.jsdelivr.net/npm/@vant/assets/custom-empty-image.png"
42         image-size="40"
43         description="暂无数据"
44       />
45 
46       <div class="footer flex" v-if="items.length != 0">
47         <span>剩余{{ notFinsh }}项</span>
48         <van-tabs
49           v-model:active="active"
50           @click-tab="onClickTab"
51           shrink
52           type="card"
53           size="small"
54         >
55           <van-tab title="全部"></van-tab>
56           <van-tab title="未完成"></van-tab>
57           <van-tab title="已完成"></van-tab>
58         </van-tabs>
59         <span type="primary" @click="onClickClear" class="fontColor"
60           >删除已完成</span
61         >
62       </div>
63     </van-cell-group>

js和css代码如下:

 1 <script>
 2 import { useStore, mapState, mapGetters } from 'vuex'
 3 import { showToast } from 'vant'
 4 import { showConfirmDialog } from 'vant'
 5 import { ref, computed } from 'vue'
 6 export default {
 7   setup() {
 8     const store = useStore()
 9     const active = ref('1')
10     const content = computed(() => store.state.content)
11     const items = computed(() => store.state.items)
12     console.log('store', store)
13     function onClickAdd() {
14       console.log('content', content)
15       if (content.value == '') {
16         showToast('输入内容不能为空')
17       } else {
18         store.commit('addItem')
19       }
20     }
21     function handleChange(e) {
22       store.commit('setInputValue', e.target.value)
23     }
24     function onClickDelete(item, i) {
25       showConfirmDialog({
26         title: '提示',
27         message: '您确定要' + item.name + '删除吗?',
28       })
29         .then(() => {
30           store.commit('deleteItem', i)
31         })
32         .catch(() => {})
33     }
34     function onChange(item, index, e) {
35       item.checked != item.checked
36       //store.commit('onChangeChecked', index, e.target.value)
37       //console.log('items', items.value)
38     }
39     function onClickClear() {
40       store.commit('clearItem')
41     }
42     function onClickTab(val) {
43       store.commit('changeItem', val.name)
44     }
45     return {
46       active,
47       onClickAdd,
48       onClickTab,
49       onClickClear,
50       onChange,
51       onClickDelete,
52       handleChange,
53       content,
54       items,
55     }
56   },
57   computed: {
58     ...mapGetters(['notFinsh', 'listItem']),
59     // ...mapState(['items', 'value',listItem]),
60   },
61 }
62 </script>
63 <style scoped>
64 .bg {
65   background: #fff;
66   width: 100%;
67 }
68 .fontColor {
69   color: #3071f1;
70   font-size: 12px;
71 }
72 .flex {
73   display: flex;
74   justify-content: space-between;
75   align-items: center;
76 }
77 .name {
78   text-align: left;
79   padding: 14px;
80 }
81 .bg >>> .van-field__control:focus {
82   outline: none;
83   border-color: #409eff;
84 }
85 .footer {
86   padding: 20px;
87 }
88 </style>

 

标签:function,todolist,items,content,item,vant4,vue3,commit,store
From: https://www.cnblogs.com/CinderellaStory/p/17458834.html

相关文章

  • 初识vue3——第一天
    api查询地址api请查阅vue3全部API初始化实例每个Vue应用都是通过createApp函数创建一个新的应用实例://index.html<divid="app"></div><scripttype="module"src="/src/main.js"></script>//main.jsimport{createApp}from'vu......
  • Vue3 setup语法糖下的axios全局设置教程
    Vue3setup语法糖下的axios全局设置教程前言在Vue3的组件式API开发下,this关键词不再适用,网上很多配置axios教程都是以Vue2为基础的,在Vue3下不再适用。近期尝试用组件式API风格写项目,在配置全局axios就遇到了这个问题。经过我反复尝试,查阅官网的文档,终于有了以下解决方法:Vue2......
  • vue3学前准备
    vue3学前准备学习vue3的原因Vue3是一个面向未来的框架:Vue3相比Vue2有更好的性能和更好的扩展性,将来会成为前端开发的主流。改进的响应式系统:Vue3采用了Proxy对象来实现响应式系统,使得性能更高、内存消耗更小、支持动态添加属性等。同时,在Vue3中,开发者也可以更容易地......
  • 完成第一个 Vue3.2 项目后,使用体会
    第一次CompositionAPI在vue3.2中,正式支持了scriptsetup的写法,这样可以大大简化组件的代码量,减少一些重复操作,我认为当你写vue3时,应该把这当作默认写法。在vue3.2之前,一般会这样写。<script>exportdefault{setup(props,ctx){consta=ref(0)//必须......
  • 完成第一个 Vue3.2 项目后,使用体会
    第一次CompositionAPI在vue3.2中,正式支持了scriptsetup的写法,这样可以大大简化组件的代码量,减少一些重复操作,我认为当你写vue3时,应该把这当作默认写法。在vue3.2之前,一般会这样写。<script>exportdefault{setup(props,ctx){consta=ref(0)//必须......
  • vue3全局注册的另一种方式——插件注册
    1.新建一个index.ts,用于管理所有全局组件//引入项目中全部的全局组件importSvgIconfrom"./SvgIcon/index.vue";importPaginationfrom"./Pagination/index.vue";//全局对象constallGlobalComponent=<any>{SvgIcon,Pagination};//对外暴露插件对象exportde......
  • vue3 条件判断语句及v-if与v-show 区别
    <template> <divv-if="type==='a'">aaa</div> <divv-else-if="type==='b'">bbb</div> <divv-else>ccc</div>  <divv-show="flag">111</div> </template>......
  • vue3元素标签属性的绑定
    <template> <divv-bind:id="main"v-bind:class="message">aaa</div></template><script> exportdefault{   data(){      return{         message:'active',         main:'mainid' ......
  • Vue3 模板语法学习
    <template> {{message}} {{number+1}} {{ok?'yes':'no'}}</template><script> exportdefault{   data(){      return{         message:'aaa',         number:10,         ok:false      }   } }&l......
  • 基于 Vue3 + TS 的前端结构
    效果预览:1构建工具构建工具选择vite,它是一个基于原生ES模块的开发服务器,能显著提升开发体验。参考:https://cn.vitejs.dev/guide/2样式处理样式预处理器选择less重置原生样式抽离通用样式,比如flex布局、内外边距、鼠标样式等3使用svg图标使用vite-svg-l......