【Vue】filter 封装

本文介绍了一个Vue.js项目中使用的自定义过滤器,包括字符串切割(ellipsis)和时间戳转换(transDateSub)。字符串切割过滤器用于当字符串长度超过指定长度时进行省略显示,而时间戳转换过滤器则将时间戳转换为更易读的日期格式。

filter.js

/**
 * Created by ZOE on 20/03/18
 */

/** format template String
 * ellipsis 字符串切割 
 * transDateSub 截取时间戳(10位)
 * 
 * 
 * 
 */
import { parseTime} from '@/utils/index'
const filters = {
	ellipsis: function (str, len){//字符串切割
		if(str.length*2 <= len) {
	    return str
	  }
	  var strlen = 0
	  var s = ""
	  for(var i = 0;i < str.length; i++) {
      s = s + str.charAt(i)
      if (str.charCodeAt(i) > 128) {
        strlen = strlen + 2
        if(strlen >= len){
            return s.substring(0,s.length-1) + "..."
        }
      } else {
        strlen = strlen + 1
        if(strlen >= len){
            return s.substring(0,s.length-2) + "..."
        }
      }
	  }
	  return s
	},
  transDateSub: function (val){
    if(val){
      return parseTime(val).substring(0, 10)
    }else{
      return '--'
    } 
  }
}
export default (Vue) => {//导出所有filters
  Object.keys(filters).forEach(key => {
      Vue.filter(key, filters[key])
  })
}

main.js

import filters from './utils/filter'//引入全局filter
filters(Vue)//注册全局filter

index.vue

<template>
<div>
    <span>{{scope.row.address | ellipsis(32)}}</span>
</div>
</template>
<script>
let ellipsis = Vue.filter('ellipsis')//引入全局filter
</script>

 

Vue2 中实现一个面包屑(Breadcrumb)组件,可以通过组件化的方式将面包屑的结构、行为和样式进行封装,使得在不同页面中可以灵活复用。以下是一个完整的实现思路和示例代码。 ### 实现思路 1. **组件结构**:使用 `<router-link>` 来支持路由跳转,面包屑项通过插槽传入。 2. **组件通信**:父组件通过插槽传递每个面包屑项的内容和链接。 3. **样式封装**:组件内部处理分隔符和样式,确保结构清晰。 ### 组件实现 #### `BreadCrumb.vue` ```vue <template> <div class="breadcrumb"> <ul class="breadcrumb-list"> <li v-for="(item, index) in breadcrumbs" :key="index" class="breadcrumb-item"> <router-link :to="item.path" v-if="item.path">{{ item.label }}</router-link> <span v-else>{{ item.label }}</span> <span v-if="index < breadcrumbs.length - 1" class="breadcrumb-separator">/</span> </li> </ul> </div> </template> <script> export default { name: 'BreadCrumb', props: { breadcrumbs: { type: Array, required: true, default: () => [] } } } </script> <style scoped> .breadcrumb { padding: 10px 0; } .breadcrumb-list { list-style: none; margin: 0; padding: 0; } .breadcrumb-item { display: inline-block; font-size: 14px; } .breadcrumb-item a { text-decoration: none; color: #333; } .breadcrumb-separator { margin: 0 8px; color: #999; } </style> ``` ### 使用方式 #### 在父组件中引入并注册 ```vue <template> <div> <BreadCrumb :breadcrumbs="breadcrumbs" /> </div> </template> <script> import BreadCrumb from './components/BreadCrumb.vue' export default { components: { BreadCrumb }, data() { return { breadcrumbs: [ { label: '首页', path: '/' }, { label: '分类', path: '/category' }, { label: '详情', path: '' } // 当前页无链接 ] } } } </script> ``` ### 动态生成面包屑 如果希望根据路由信息自动生成面包屑,可以在组件中监听 `$route` 变化并解析路由路径: ```vue <template> <div> <BreadCrumb :breadcrumbs="breadcrumbs" /> </div> </template> <script> import BreadCrumb from './components/BreadCrumb.vue' export default { components: { BreadCrumb }, data() { return { breadcrumbs: [] } }, watch: { $route: { immediate: true, handler(route) { const matched = route.matched.filter(item => item.name) this.breadcrumbs = matched.map(item => ({ label: item.name, path: item.path })) } } } } </script> ``` ### 插槽方式实现灵活内容 如果希望更灵活地传递内容,可以使用插槽机制: ```vue <template> <BreadCrumb> <BreadCrumbItem to="/">首页</BreadCrumbItem> <BreadCrumbItem :to="`/category/${goods.category.id}`">{{ goods.category.name }}</BreadCrumbItem> </BreadCrumb> </template> ``` #### `BreadCrumbItem.vue` ```vue <template> <li class="breadcrumb-item"> <router-link :to="to" v-if="to">{{ label }}</router-link> <span v-else>{{ label }}</span> <span v-if="hasSeparator" class="breadcrumb-separator">/</span> </li> </template> <script> export default { name: 'BreadCrumbItem', props: { to: { type: [String, Object], default: null }, label: { type: String, required: true } }, computed: { hasSeparator() { return this.$parent.$children.indexOf(this) < this.$parent.$children.length - 1 } } } </script> ``` #### `BreadCrumb.vue`(支持插槽) ```vue <template> <ul class="breadcrumb-list"> <slot /> </ul> </template> ``` ### 优点 - **可复用性**:组件可以在多个页面复用,只需传入不同的 `breadcrumbs` 数据。 - **动态支持**:结合 `$route` 可以实现自动根据当前路径生成面包屑。 - **样式统一**:通过封装样式,确保整个项目中面包屑风格统一。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值