Vue模块化以及封装Storage组件实现保存搜索的历史记录

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面渲染数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
刷新后就没有数据了,需要对数据进行缓存!
在这里插入图片描述
H5中有localstogry可以进行缓存。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
改变后的数据没有存入localstogy中.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
备份localstory,进行封装;
在这里插入图片描述
对localStorage进行封装;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(一)、未添加缓存数据之前,数据会丢失;

<template>
  <div id="app">
   <input  type="text" v-model='todo'/>
   <button @click="doAdd()">+增加</button>
   <br> 
   <h2>进行中</h2>
    <template v-for="(item,key) in list" :key="item">
              <h-tab-pane v-if="item.checked">
                 <br>
                 <input type='checkbox' v-model='item.checked'>{{item.title}}---
<button @click="removeData(key)">删除</button>
              </h-tab-pane>
    </template>
   <br> 
   <h2>已完成</h2> 
    <template v-for="(item,key) in list" :key="item">
              <h-tab-pane v-if="!item.checked">
                 <input type="checkbox" v-model='item.checked'>{{item.title}}---
<button @click="removeData(key)">删除</button>
              </h-tab-pane>
    </template>
  </div>
</template>
<script>
export default {
  // name:"app",
  data(){
     return{
       todo:'',
       list:[]
       }
     },methods:{
         doAdd(){
          //1、获取文本框输入的值
          //2、把文本框的值push到list里面
          this.list.push({title:this.todo,checked:true});  
         },
         removeData(key){
         //splice js操作数组的方法
          this.list.splice(key,1);
         }
     }
}
</script>
<style>
h-tab-pane{
  background:red;
  input{
    background:green;
  }
}
</style>

刷新前页面效果:
在这里插入图片描述
刷新页面后:
在这里插入图片描述
键盘事件监听:

<template>
  <div id="app">
   <input  type="text" v-model='todo'   @keydown="pressBoard($event)"/>
   <h2>进行中</h2>
    <template v-for="(item,key) in list" :key="item">
              <h-tab-pane v-if="item.checked">
                 <input type='checkbox' v-model='item.checked'>{{item.title}}---
<button @click="removeData(key)">删除</button>
              </h-tab-pane>
    </template>
   <h2>已完成</h2> 
   <template v-for="(item,key) in list" :key="item">
              <h-tab-pane v-if="!item.checked">
                 <input type="checkbox" v-model='item.checked'>{{item.title}}---
<button @click="removeData(key)">删除</button>
              </h-tab-pane>
    </template>
  </div>
</template>
<script>
export default {
  // name:"app",
  data(){
     return{
       todo:'',
       list:[]
       }
     },methods:{
         doAdd(){
          //1、获取文本框输入的值
          //2、把文本框的值push到list里面
          this.list.push({title:this.todo,checked:true});  
         },
         removeData(key){
         //splice js操作数组的方法
          this.list.splice(key,1);

         },
         pressBoard(e){
         if(e.keyCode==13){
           this.list.push({title:this.todo,checked:true});
           this.todo='';
          }
         }
     }
}
</script>
<style>
h-tab-pane{
  background:red;
  input{
    background:green;
  }
}
</style>

在这里插入图片描述
H5中有localstogry可以进行缓存。

<template>
  <div id="app">
   <input  type="text" v-model='todo'   @keydown="pressBoard($event)"/>
   <!-- <button @click="doAdd()">+增加</button> -->
   <h2>进行中</h2>
    <template v-for="(item,key) in list" :key="item">
              <h-tab-pane v-if="item.checked">
                 <input type='checkbox' v-model='item.checked'>{{item.title}}---
<button @click="removeData(key)">删除</button>
              </h-tab-pane>
    </template>
   <h2>已完成</h2> 
   <template v-for="(item,key) in list" :key="item">
              <h-tab-pane v-if="!item.checked">
                 <input type="checkbox" v-model='item.checked'>{{item.title}}---
<button @click="removeData(key)">删除</button>
              </h-tab-pane>
    </template>
    </div>
</template>
<script>
export default {
  // name:"app",
  data(){
     return{
       todo:'',
       list:[]
       }
     },
     methods:{
         doAdd(){
          //1、获取文本框输入的值
          //2、把文本框的值push到list里面
          this.list.push({title:this.todo,checked:true}); 
          //JSON.stringify(this.list) 将json对象转化为json字符串
          localStorage.setItem('list',JSON.stringify(this.list)); 
         },
         removeData(key){
         //splice js操作数组的方法
          this.list.splice(key,1);
          localStorage.setItem('list',JSON.stringify(this.list)); 
         },
         pressBoard(e){

         if(e.keyCode==13){

           this.list.push({title:this.todo,checked:true});
           this.todo='';
           }
          localStorage.setItem('list',JSON.stringify(this.list)); 
         }
     },
      mounted:function(){  // 生命周期函数,与data、methods 同级别  vue页面刷新就会触发的方法
        //JSON.parse() 将json字符串转换为json对象
// eslint-disable-line no-unused-vars
        var list = JSON.parse(localStorage.getItem('list'));
        if(list){
          //刷新页面。从缓存中获取数据返回给list
          this.list=list;
        }
     }
}
</script>
<style>
h-tab-pane{
  background:red;
  input{
    background:green;
  }
}
</style>

刷新页面后,数据从页面缓存中获取,页面数据不会丢失;
在这里插入图片描述

<template>
  <div id="app">
   <input  type="text" v-model='todo'   @keydown="pressBoard($event)"/>
   <h2>进行中</h2>
    <template v-for="(item,key) in list" :key="item">
              <h-tab-pane v-if="item.checked">
                 <br>
                 <input type='checkbox' v-model='item.checked' @change="saveList()">
{{item.title}}---<button @click="removeData(key)">删除</button>
              </h-tab-pane>
    </template>
   <h2>已完成</h2> 
   <template v-for="(item,key) in list" :key="item">
              <h-tab-pane v-if="!item.checked">
                 <br>
                 <input type="checkbox" v-model='item.checked'  @change="saveList()">
{{item.title}}---<button @click="removeData(key)">删除</button>
              </h-tab-pane>
    </template>
  </div>
</template>
<script>
export default {
  // name:"app",
  data(){
     return{
       todo:'',
       list:[]
       }
     },
     methods:{
         doAdd(){
          //1、获取文本框输入的值
          //2、把文本框的值push到list里面
          this.list.push({title:this.todo,checked:true}); 
          //JSON.stringify(this.list) 将json对象转化为json字符串
          localStorage.setItem('list',JSON.stringify(this.list)); 
         },
         removeData(key){
         //splice js操作数组的方法
          this.list.splice(key,1);
          localStorage.setItem('list',JSON.stringify(this.list)); 
         },
         pressBoard(e){
         if(e.keyCode==13){
           this.list.push({title:this.todo,checked:true});
           this.todo='';
           }
          localStorage.setItem('list',JSON.stringify(this.list)); 
         },
         saveList(){
            localStorage.setItem('list',JSON.stringify(this.list)); 
         }
     },// 生命周期函数,与data、methods 同级别 vue页面刷新就会触发的方法
      mounted:function(){          
//JSON.parse() 将json字符串转换为json对象
// eslint-disable-line no-unused-vars

        var list = JSON.parse(localStorage.getItem('list'));        
        if(list){
          //刷新页面。从缓存中获取数据返回给list
          this.list=list;
        }
      }
}
</script>
<style>
h-tab-pane{
  background:red;
  input{
    background:green;
  }
}
</style>

在这里插入图片描述
下面对重复代码进行封装。

封装的storage.js:
路径:src/model/storage.js

//在src下创建model文件夹,model文件夹中创建storage.js文件
//用到了node js 基础
var storage = { 
   set(key,value){
    localStorage.setItem(key,JSON.stringify(value));
   },
   get(key){
    return  JSON.parse(localStorage.getItem(key));
   },
   remove(key){
      localStorage.remove(key);
   }
}
//通过export default将storage暴漏出去
export   default  storage;

在这里插入图片描述

<template>
  <div id="app">
   <input  type="text" v-model='todo'   @keydown="pressBoard($event)"/>
   <h2>进行中</h2>
    <template v-for="(item,key) in list" :key="item">
              <h-tab-pane v-if="item.checked">
                 <br>
                 <input type='checkbox' v-model='item.checked' 
@change="saveList()">{{item.title}}---
<button @click="removeData(key)">删除</button>
              </h-tab-pane>
    </template>
   <h2>已完成</h2> 
    <template v-for="(item,key) in list" :key="item">
              <h-tab-pane v-if="!item.checked">
                <input type="checkbox" v-model='item.checked' @change="saveList()">
{{item.title}}---<button @click="removeData(key)">删除</button>
              </h-tab-pane>
    </template>
  </div>
</template>
<script>
//script中引入暴漏的storage
import storage  from  './model/storage.js'
console.log(storage);

export default {
  // name:"app",
  data(){
     return{
       todo:'',
       list:[]
       }
     },
     methods:{
         doAdd(){
          //1、获取文本框输入的值
          //2、把文本框的值push到list里面
          this.list.push({title:this.todo,checked:true}); 
          //JSON.stringify(this.list) 将json对象转化为json字符串
          storage.set('list',JSON.stringify(this.list));
         },
         removeData(key){
         //splice js操作数组的方法
          this.list.splice(key,1);
             storage.set('list',JSON.stringify(this.list));
         },
         pressBoard(e){
         if(e.keyCode==13){
           this.list.push({title:this.todo,checked:true});
           this.todo='';
           }
          storage.set('list',JSON.stringify(this.list));
         },
         saveList(){
            storage.set('list',JSON.stringify(this.list));
         }
     }, // 生命周期函数,与data、methods 同级别  vue页面刷新就会触发的方法
      mounted:function(){         //JSON.parse() 将json字符串转换为json对象
// eslint-disable-line no-unused-vars
 var list = storage.get('list');
        if(list){
          //刷新页面。从缓存中获取数据返回给list
          this.list=list;
        }
      }
}
</script>
<style>
h-tab-pane{
  background:red;
  input{
    background:green;
  }
}
</style>
  

错误:‘x‘ is assigned a value but never used no-unused-vars
报错:
97:21 error ‘count’ is assigned a value but never used no-unused-vars
✖ 1 problem (1 error, 0 warnings)
发生原因:
发生这种情况是因为eslint的验证语法,您正在定义x但未使用它。
解决方法如下:
只需将其删除
在错误代码后加入该行注释就行:
// eslint-disable-line no-unused-vars
修改后为:
let count = 10000 // eslint-disable-line no-unused-vars
this.$nextTick(function() {
console.log('DOM 更新了 ’ )
})
原文链接:https://blog.csdn.net/xiaoyuer_2020/article/details/110429773

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3 的组件封装非常简单,下面是一个搜索组件封装示例: 首先,创建一个 Search.vue组件,它的模板如下: ```html <template> <div class="search"> <input type="text" v-model="searchInput" @input="handleInput" /> <button @click="handleSearch">搜索</button> </div> </template> ``` 在组件中,我们需要引入 `reactive`,这是 Vue3 中新加入的函数,用于将数据转换为响应式的数据。我们还需要定义 `props`,用于接收父组件传递的参数,以及定义 `emit`,用于向父组件发送事件。 ```javascript import { defineComponent, reactive, emit } from 'vue'; export default defineComponent({ name: 'Search', props: { placeholder: { type: String, default: '请输入关键词', }, }, setup(props, { emit }) { const searchInput = reactive({ value: '', }); const handleInput = (event) => { searchInput.value = event.target.value; }; const handleSearch = () => { emit('search', searchInput.value); }; return { searchInput, handleInput, handleSearch, }; }, }); ``` 在 `setup` 函数中,我们使用 `reactive` 将 `searchInput` 对象转换为响应式数据。当用户输入关键词时,`handleInput` 函数被调用,将输入的值赋值给 `searchInput.value`。当用户点击搜索按钮时,`handleSearch` 函数被调用,向父组件发送 `search` 事件,并将输入框的值作为参数传递给父组件。 最后,在父组件中使用该组件: ```html <template> <div> <Search placeholder="请输入关键词" @search="handleSearch" /> <ul> <li v-for="item in searchResult" :key="item.id">{{ item.name }}</li> </ul> </div> </template> <script> import Search from './Search.vue'; export default { components: { Search, }, data() { return { searchResult: [], }; }, methods: { handleSearch(keywords) { // 这里实现搜索逻辑,将搜索结果赋值给 searchResult this.searchResult = [ { id: 1, name: '搜索结果1' }, { id: 2, name: '搜索结果2' }, { id: 3, name: '搜索结果3' }, ]; }, }, }; </script> ``` 在父组件中,我们通过 `@search` 监听子组件的 `search` 事件,并在 `handleSearch` 方法中实现搜索逻辑。将搜索结果赋值给 `searchResult`,然后通过 `v-for` 渲染出结果列表。 这就是 Vue3 中搜索组件封装方法,简单易用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值