vue key重复_得心应用的Vue高级技巧

关注  Vue中文社区 ,回复“ 加群 ” 加入我们一起学习,天天进步 1cc508700c2c049fe580702afad23525.png 1,require.context() 一个webpack的api,通过执行require.context函数获取一个特定的上下文,主要用来实现自动化导入模块,在前端工程中,如果遇到从一个文件夹引入很多模块的情况,可以使用这个api,它会遍历文件夹中的指定文件,然后自动导入,使得不需要每次显式的调用import导入模块 语法:
/** * directory {String} -说明需要检索的目录 * useSubdirectories {Boolean} -是否遍历文件的子目录 * regExp {RegExp} - 匹配文件的正则 **/require.context(directory, useSubdirectories = false, regExp = /^.//);
场景: 1,开发vue项目的时候一般都会开发很多自定义的全局组件, 一般写法是:这样的话如果我们封装了50个组件,那么就意味我们要写50个相同的组件引入语句,50个注册语句,大量的重复代码: 86a7f79b2d94d8926ff51dcc056d3bbb.png 如果使用require.context那么就可以是下面这个样子,这样我们可以无限的在components文件下添加组件,自动注册成全局的
const files = require.context('@/components', true, /^\.\/(\w*\/)+index\.(vue|js)$/)export default {  install (Vue) {    files.keys().forEach((path) => {      const type = this.typeof(path, files(path))      // 针对3中不同的组件设计模式提供不同的组件注册策略      switch (type) {        case 'component':          this.installComonent(Vue, files(path));        break;        case 'componentGroup':          this.instalGroupComponent(Vue, files(path));        break;        case 'serveApi':            this.installServeApi(Vue, files(path));        break;      }    })  },  typeof (path, file) {    if (path.lastIndexOf('.js') === -1) {      return 'component'    } else {      if (file.default.install) {        return 'serveApi'      } else {        return 'componentGroup'      }    }  },  instalGroupComponent (Vue, file) {    const components = file.default    Object.keys(components).forEach((name) => {      Vue.component('Nb'+name, components[name])    })  },  installComonent (Vue, file) {    const options = file.default    const name = options.name    Vue.component('Nb'+name, options)  },  installServeApi (Vue, file) {    Vue.use(file.default)  }}
2,开发一个svg图标组件,可能需要很多svg文件,需要通过webpack打包,如果全部一个一个引入的话,会比较麻烦,如果使用context api的话可以直接读取文件夹下的所有svg图标 3b7d0efdf360d0247ca217315e8bbd96.png 2,watch场景: 1,立即执行 表格初始进来需要调查询接口 fetchList(),然后筛选条件的值发生改变会重新查询
created(){  this.fetchList()},watch: {  'filters.type' () {    this.fetchList()  }}
可以直接利用 watch 的immediate和handler属性简写
watch: {  'filters.type': {    handler: 'getList',    immediate: true  }}
2,深度监听, 有时候我们可能需要监听整个对象,还是上面那个例子,上面我们针对一个对象中的某个属性进行监听,但是这个对象中有很多属性,任何一个属性的改变我们都需要重新发起请求,那么我们可以利用watch的deep属性进行深度监听,也就是监听复杂的数据类型
watch:{  filters: {    handler(newVal,oldVal){      this.getList()    },    deep:true,    immediate: true  }}
3,mixins 有些组件有些重复的 js 逻辑,比如我们常用的上啦加载更多,而上啦触底事件就是我们每个需要上啦加载功能页面都需要重复去写的逻辑,这部分东西我们都可以使用mixins来实现 85692a36a25d130863340448d596280a.png 9b3cc471977d6e0f328438006ec8c65f.png 4,Vue.nextTick 2.1.0 新增 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM 这个api的使用场景主要是为替代updated生命周期,有时候我们可能需要在数据更新后操作新的dom,但是updated生命周期是更新后执行,但是无法确定是那个属性的改变触发的更新,而nextTick是可以写在某个属性改变的后面,这么我们就可以知道是那个属性的改变了,功能其实和react,setState函数的第二个参数 4, Vue.filter  全局过滤器 过滤器的目的主要为了对数据格式进行转换(银行卡号格式化,货币格式化,日期格式化,...) 那么我用computed计算属性也可以呀,为什么要用filter,答案就是computed不能接受参数只能针对某一个vue内部属性进行转换,而filter可以接受参数 场景:时间戳转化成年月日这是一个公共方法,所以可以抽离成过滤器使用
// 使用// 在双花括号中{{ message | capitalize }}// 在 `v-bind` 中// 全局注册Vue.filter('stampToYYMMDD', (value) =>{  // 处理逻辑})// 局部注册filters: {  stampToYYMMDD: (value)=> {    // 处理逻辑  }}// 多个过滤器全局注册// /src/common/filters.jslet dateServer = value => value.replace(/(\d{4})(\d{2})(\d{2})/g, '$1-$2-$3') export { dateServer }// /src/main.jsimport * as custom from './common/filters/custom'Object.keys(custom).forEach(key => Vue.filter(key, custom[key]))
4, css 局部样式 Vue中style标签的scoped属性表示它的样式只作用于当前模块,是样式私有化. 渲染的规则/原理: 给HTML的DOM节点添加一个 不重复的data属性 来表示 唯一性 在对应的 CSS选择器 末尾添加一个当前组件的 data属性选择器来私有化样式 问题: 使用了scoped属性后,我们组件内部的样式无法在外部被控制,(怎么就是改不了样式,... 我要疯了咋没反应ad267c553e7890c406658e684028daef.png) 解决方案:deep属性
.result-tab /deep/ {  .nav-bar {    a {      flex: initial;      height: 50px;      font-size: 36px;      margin-left: 40px;      line-height: 100px;      height: auto;    }  }  .result-content {    padding: 0 40px;  }}
作者: 长满头发的程序员 往期
阿里、腾讯、头条、美团、多家企业再次延长上班时间 11 个Chrome骚技巧让你为所欲为 b11c50e51f6d25070799153370b344a7.png 转发在看就是最大的支持❤️
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您的问题是关于Vue.js实现前端列表多条件筛选的问题,同时涉及Vuekey属性的重复问题。 对于实现前端列表多条件筛选,一种常见的法是使用计算属性来过滤列表数据。具体来说,可以定义一个包含各种筛选条件的data对象,然后在计算属性中根据这些条件来过滤原始的列表数据。例如: ``` <template> <div> <label>关键字:</label> <input v-model="filter.keyword"> <label>状态:</label> <select v-model="filter.status"> <option value="">全部</option> <option value="1">已完成</option> <option value="0">未完成</option> </select> <ul> <li v-for="item in filteredList" :key="item.id">{{ item.name }}</li> </ul> </div> </template> <script> export default { data() { return { list: [ { id: 1, name: '任务1', status: 1 }, { id: 2, name: '任务2', status: 0 }, { id: 3, name: '任务3', status: 1 } ], filter: { keyword: '', status: '' } } }, computed: { filteredList() { return this.list.filter(item => { return item.name.indexOf(this.filter.keyword) !== -1 && (this.filter.status === '' || item.status.toString() === this.filter.status) }) } } } </script> ``` 在上面的代码中,我们定义了一个包含列表数据和筛选条件的data对象,其中filter对象包含了关键字和状态两个筛选条件。然后,在计算属性filteredList中,我们使用filter函数来过滤原始列表数据,其中关键字筛选使用了JavaScript的字符串indexOf方法,状态筛选则使用了三目运算符来判断是否需要进行状态筛选。 在这个例子中,我们没有显式地使用key属性来指定每个列表项的唯一标识符。这是因为Vue.js默认会使用每个列表项的下标作为其key值。然而,如果列表数据是动态的,那么可能会出现某些列表项的下标发生变化的情况,从而导致Vue.js无法正确地更新DOM。为了解决这个问题,我们可以显式地指定每个列表项的唯一标识符,例如使用item.id作为key值。这样可以确保每个列表项的key值始终唯一,从而避免出现更新DOM时的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值