vue 动态面包屑,

  vue 动态面包屑,

  这篇文章主要为大家详细介绍了某视频剪辑软件项目实现面包屑导航,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  本文实例为大家分享了某视频剪辑软件项目实现面包屑导航的具体代码,供大家参考,具体内容如下

  安装依赖

  npm i vuex

  创建tagView.vue

  模板

  div class=标记-视图-容器

  滚动窗格 tags-view-wrapper ref=滚动窗格

  路由器链接

  ref=tag

  :to=tag

  :class=isActive(tag)?操作 :

  class=scrollPane_item

  @上下文菜单。预防。native= openMenu(tag,$event)

  Array.from(已访问视图)中的v-for=标记

  :key=tag.path

  {{tag.title}}

  错误关闭图标:class=isActive(tag)?图标激活“: ”@点击。预防。stop= closeSelectedTag(tag)/span

  /路由器链接

  /滚动窗格

  ul class=上下文菜单 v-show= visible :style= { left:left px ,top: top px}

  Li @ click= closeSelectedTag(所选标记)关闭/李

  li @ click= closeOthersTags 关闭其他/李

  li @click=closeAllTags 关闭所有/李

  /ul

  /div

  /模板

  脚本

  从导入滚动窗格./scrollPane/scrollpane

  导出默认值{

  名称:标签-视图,

  组件:{ ScrollPane },

  data(){

  返回{

  可见:假,

  top: 0,

  左:0,

  selectedTag: {}

  ScrollAction: false

  }

  },

  计算值:{

  visitedViews(){

  归还这个100美元商店。状态。标签视图。已访问视图

  }

  },

  观察:{

  $route(){

  this.addViewTags()

  this.moveToCurrentTag()

  },

  可见(值){

  如果(值){

  文档。身体。addevent侦听器( click ,this.closeMenu)

  }否则{

  文档。身体。removeeventlistener( click ,this.closeMenu)

  }

  }

  },

  已安装(){

  this.addViewTags()

  },

  方法:{

  generateRoute(){

  如果(这个. route.name) {

  归还这个。$路线

  }

  返回错误的

  },

  isActive(路线){

  返回route.path===this .$route.path

  },

  addViewTags() {

  const route=this.generateRoute()

  如果(!路线){

  返回错误的

  }

  这个100美元商店。分派( addVisitedViews ,路线)

  },

  moveToCurrentTag() {

  常量标签=这个.$refs.tag

  这个. nextTick(()={

  对于(标签的常量标签){

  if (tag.to.path===this .$route.path) {

  这个refs.scrollPane.moveToTarget(标记100万美元)

  破裂

  }

  }

  })

  },

  closeSelectedTag(视图){

  这个100美元商店。调度( delVisitedViews ,视图).然后((视图)={

  if (this.isActive(view)) {

  const最新视图=视图。切片(-1)[0]

  如果(最新视图){

  这个10.99 $ router . push(最新视图)

  }否则{

  这个. router.push(/homePage )

  }

  }

  })

  },

  closeOthersTags() {

  这个. router.push(this.selectedTag)

  这个100美元商店。调度( delOthersViews ,this.selectedTag).然后(()={

  this.moveToCurrentTag()

  })

  },

  closeAllTags() {

  这个store.dispatch(delAllViews )

  这个. router.push(/homePage )

  },

  openMenu(tag,e) {

  this.visible=true

  this.selectedTag=tag

  this.left=e.clientX 30 //15:右边距

  this.top=e。客户

  },

  closeMenu() {

  this.visible=false

  }

  }

  }

  /脚本

  风格

  @import ./tagview。scss’;

  /风格

  创建tagView.scss。标签-视图-容器{

  身高:100%;

  }。上下文菜单{

  边距:0;

  背景:# fff

  z指数:100;

  位置:绝对;

  列表样式类型:无;

  填充:5px 0;

  边框-半径:4px

  字体大小:12px

  字体粗细:400;

  颜色:# 333;

  箱形阴影:2px 2px 3px 0 rgba(0,0,0,3);

  }。上下文菜单李{

  边距:0;

  填充:7像素16像素

  光标:指针;

  }。李:悬停{

  背景:# eee

  }。标签-视图-包装器一个{

  显示:内嵌-块;

  位置:相对;

  宽度:100像素

  填充:0 10px

  颜色:# 000;

  背景:# fff

  文本对齐:居中;

  字号:15px

  }。动作{

  边框-底部:2px实心# 1AB394

  }。关闭图标{

  颜色:# fff

  左边距:3px

  }。IconActive {

  颜色:# b1b1b1

  }

  创建tagViews.js

  const tagsView={

  状态:{

  已访问视图:[],

  缓存视图:[]

  },

  突变:{

  ADD_VISITED_VIEWS: (state,view)={

  如果(状态。已访问的视图。有的(v=v . path===查看。路径))返回

  状态。已访问的视图。推(对象。分配({ },查看,{

  title: view.meta.title 无名称

  }))

  如果(!view.meta.noCache) {

  状态。缓存视图。推送(查看。姓名)

  }

  },

  DEL_VISITED_VIEWS: (state,view)={

  对于(状态。已访问的视图。条目()的const [i,v]){

  if (v.path===view.path) {

  state.visitedViews.splice(i,1)

  破裂

  }

  }

  对于(状态。缓存视图的const I){

  if (i===view.name) {

  常数索引=状态。cachedviews。索引(一)

  state.cachedViews.splice(索引,1)

  破裂

  }

  }

  },

  DEL_OTHERS_VIEWS: (state,view)={

  对于(状态。已访问的视图。条目()的const [i,v]){

  if (v.path===view.path) {

  状态。访问量=状态。已访问的视图。切片(I,i 1)

  破裂

  }

  }

  对于(状态。缓存视图的const I){

  if (i===view.name) {

  常数索引=状态。cachedviews。索引(一)

  状态。缓存视图=状态。缓存视图。切片(索引,i 1)

  破裂

  }

  }

  },

  DEL_ALL_VIEWS: (state)={

  state.visitedViews=[]

  state.cachedViews=[]

  }

  },

  动作:{

  addVisitedViews({ commit },view) {

  提交(添加已访问视图,视图)

  },

  delVisitedViews({ commit,state },view) {

  返回新承诺((解决)={

  提交( DEL_VISITED_VIEWS ,视图)

  解决([.state.visitedViews])

  })

  },

  delOthersViews({ commit,state },view) {

  返回新承诺((解决)={

  提交( DEL_OTHERS_VIEWS ,视图)

  解决([.state.visitedViews])

  })

  },

  delAllViews({ commit,state }) {

  返回新承诺((解决)={

  提交(“删除所有视图”)

  解决([.state.visitedViews])

  })

  }

  }

  }

  导出默认标签视图

  创建scrollPane.vue

  模板

  div class=" scroll-container " ref=" scroll container " @ wheel。防止=处理滚动

  div class= scroll-wrapper ref= scroll wrapper :style= { left:left px }

  插槽/插槽

  /div

  /div

  /模板

  脚本

  常量填充=15 //标记的填充

  导出默认值{

  名称:“scrollPane”,

  data() {

  返回{

  左侧:0

  }

  },

  方法:{

  手柄卷轴(e) {

  const event delta=e . wheel delta -e . deltay * 3//wheel delta:-120;deltaY:-120

  const $container=this .$refs.scrollContainer//外面的容器

  const $ container宽度=$ container。offsetwidth//外面的容器的宽度

  const $wrapper=this .$refs.scrollWrapper//里面

  const $ wrapper宽度=$ wrapper。offsetwidth//里面的宽度

  if (eventDelta 0) {

  this.left=Math.min(0,this.left eventDelta)//min()方法可返回指定的数字中带有最低值的数字。

  }否则{

  if($容器宽度-填充$包装宽度){

  如果(这个。left-($ wrapper width-$ container width padding)){

  左=左

  }否则{

  这个。左=数学。max(这个。左事件增量,$容器宽度-$包装宽度-填充)

  }

  }否则{

  this.left=0

  }

  }

  },

  moveToTarget($target) {

  const $container=this .$refs.scrollContainer

  const $ container宽度=$ container。偏移距离

  const $ target left=$ target。向左偏移

  const $ target宽度=$ target。偏移距离

  if ($targetLeft -this.left) {

  这个。left=-$ target左填充

  } else if(target左填充-this。left $ target left $ target宽度-this。left $ container width-padding){

  }否则{

  这个。left=-($ target left-($容器宽度-$目标宽度)填充)

  }

  }

  }

  }

  /脚本

  风格。滚动容器{

  空白:nowrap

  位置:相对;

  溢出:隐藏;

  宽度:100%;

  身高:100%;

  框大小:边框-框;

  }。卷轴包装{

  身高:100%;

  行高:41px

  位置:绝对;

  }

  /风格

  商店中索引。射流研究…配置

  从“vue”导入某视频剪辑软件

  从" vuex "导入状态管理

  从导入*作为类型。/类型

  导入标签视图自./assets/js/tagsview

  Vue.use(Vuex)

  const store=new Vuex .商店({

  模块:{

  标签视图

  }

  })

  导出默认存储

  商店中的type.js配置

  导出常量登录=登录

  导出常量注销=注销

  导出常数TITLE=title

  router.js修改配置

  对点击左侧按钮根据路由器视图显示清理缓存

  最后在主页。射流研究…中引入商店。射流研究…

  从导入存储/store/index //导入状态管理器状态管理

  新Vue({

  埃尔: #app ,

  路由器,

  店,

  组件:{ App },

  模板:"应用程序/"

  })

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: