function flatten (parent, data = [], menusRaw = []) { return data.reduce((acc, { name, children }) => { const menu = menusRaw.filter(x => x.Url === name)[0] if (!menu) return acc const MenuName = menu.MenuName const item = { Url: name, MenuName, parent } if (children && children.length) { const p = parent.concat({ Url: name, MenuName }) return acc.concat(item, flatten(p, children, menusRaw)) } return acc.concat(item) }, []) } export default { state: { menusRaw: [], menus: [], breadcrumb: [], }, mutations: { updateBread (state, { routerData, Url }) { // 扁平 routerData // 同时构造出 含有 title 的 parent 数据 const routeList = flatten([], routerData, state.menusRaw) // 过滤出与 name 相同的 route 节点 const currentRoute = routeList.filter(x => x.Url === Url)[0] // 获取 面包屑 if (currentRoute) state.breadcrumb = currentRoute.parent.slice(1).concat(currentRoute) } } }