架构使用vuex结合vue-meta实现router动态设置meta标签

摘要:
您可以导入vue元模块,通过路由保护侦听获取路由中元的定义值,将获得的值分配给vuex中模块模块中的状态,然后通过vue元模型中的metaInfo方法修改元标记引用:https://www.imooc.com/article/2880451.安装npminstallvue meta Snpminstallvuex-S2,main.jsi

可以通过引入vue-meta模块,通过路由守卫监听获取到路由中meta的定义的值,再将获取到的值赋值到vuex中module模块中的state,再将模块中的值通过vue-meta模块中的metaInfo方法修改meta标签

参考:https://www.imooc.com/article/288045

架构使用vuex结合vue-meta实现router动态设置meta标签第1张

1、安装

npm install vue-meta -S
npm install vuex -S

2、main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import vueMeta from 'vue-meta'
Vue.use(vueMeta)
Vue.config.productionTip = false;
new Vue({
  router,
  store,
 // 通过vue-meta中的metaInfo()方法把从vuex的模块metaModule中state获取到的值设置到代码中 metaInfo() {
return { title: this.$store.state.metaModule.metaInfo.title, meta: [ { name: "keywords", content: this.$store.state.metaModule.metaInfo.keywords }, { name: "description", content: this.$store.state.metaModule.metaInfo.description } ] } }, render: h => h(App) }).$mount('#app')

3、router.js

const routes = [
    {
        path: '/',
        name: 'Home',
        component: () => import('../views/Home.vue'),
        meta: {
        // 在路由中设置meta中需要的信息 metaInfo: { title:
"首页 title", keywords: "首页 keywords", description: "首页 description" } } }, { path: '/about', name: 'About', component: () => import('../views/About.vue'), meta: { metaInfo: { title: "关于 title", keywords: "关于 keywords", description: "关于 description" } } } ] export default routes

router/index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from "./router"
import store from "../store"
Vue.use(VueRouter)
const router = new VueRouter({
  routes
});
// 全局前置守卫
router.beforeEach((to, from, next) => {
  console.log(to);
  console.log(from);
  if (to.meta.metaInfo) {
  // 调用vuex的metaModule模块中的方法将从获取路由中到的值赋值到vuex的metaModule模块中的state中去 store.commit(
"metaModule/CAHNGE_META_INFO", to.meta.metaInfo) } next() }) // 全局解析守卫 // 在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用 router.beforeResolve((to, from, next) => { console.log(to); console.log(from); next() }) // 全局后置狗子 router.afterEach((to, from) => { // ... console.log(to); }) export default router

4、store/index.js

import Vue from 'vue'
import Vuex from 'vuex'
import metaModule from './modules/vueMeta'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  // 引入模块 metaModule: metaModule } })

store/modules/vueMeta/index.js

export default ({
    namespaced: true,
    state: {
        metaInfo: {
            title: "",
            keywords: "",
            description: ""
        }
    },
    mutations: {
        CAHNGE_META_INFO(state, metaInfo) {
            state.metaInfo = metaInfo;
        }
    },
    actions: {
    },
    modules: {
    }
})

在某个单独页面修改metaInfo,这个会覆盖router.js中的路由中metaInfo

<template>
  <div>
    <h1>{{{ title }}}</h1>
  </div>
</template>

<script>
  export default {
    name: 'post',
    data () {
      return {
        title: '',
        keywords: '',
        description: '这是一篇文章...'
      }
    },
    metaInfo () {
      return {
        title: this.title,
        meta: [
          { vmid: 'keywords', name: 'keywords', content: this.description },
          { vmid: 'description', name: 'description', content: this.description }
        ]
      }
    },
    created () {
      this.initData()
    },
    methods: {
      initData () {
        axios.get('some/url').then((resp) => {
          // 设置title时 metaInfo 会同时更新
          this.title = resp.title
          this.description = resp.decription
        })
      }
    }
  }
</script>

免责声明:文章转载自《架构使用vuex结合vue-meta实现router动态设置meta标签》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇RabbitMQ(五)Springboot集成RabbitMQMySQL -- Innodb是如何处理自增列的下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CSS之多个div一行排列

  使多个div横着排的两种方法,一种是浮动float,一种是布局display   一、使用float   元素一旦浮动,脱离文档流(不占页面空间,后面未浮动元素会上前补位。   1、代码示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="...

H5调用手机的相机/摄像/录音等功能 _input:file的capture属性说明

H5使用input标签调用系统默许相机,摄像,录音功能。使用input:file标签, 去调用系统默认相机,摄像,录音功能,其实是有个capture属性,直接说明需要调用什么功能: <input type="file" accept="image/*" capture="camera"> <input type="file" accept...

前端知识 — HTML内容、CSS基础

前端1、前端是做什么的 2、我们为什么要学前端? 3、前端都有哪些内容? 1、HTML 2、CSS 3、JavaScript 4、jQuery和Bootstrap Web开发本质: 1、浏览器输入网址回车都发生了什么? 1、浏览器给服务端发送了一个消息 2、服务端拿到消息 3、服务端返回消息 4、浏览器展示页面 importsocket sk =sock...

CocosCreator 从Git拉取项目meta文件变更问题 (资源变更警告、class already exists、大小写敏感)

参考: cocos meta git 提示 cocos论坛-资源变更警告 cocos论坛-class already exists meta文件被修改 从git拉取项目后,meta文件被修改 这个问题的原因是git在windows和linux不同系统间换行符不一样。 windows 换行符 linux 换行符 我们可以手动设置git让两个系统的文件的...

CSS兼容IE6,IE7,FF的技巧

一、CSS HACK以下两种方法几乎能解决现今所有HACK.翻阅很多资料,已测试可以使用。 1, !important 随着IE7对!important的支持, !important 方法现在只针对IE6的HACK.(注意写法.记得该声明位置需要提前.) PLAIN TEXTCSS: #wrapper{ 100px!important; /* IE7+FF...

HTML页面过渡效果大全

IE要求:  在IE5.5及以上版本的浏览器中.启用网页过渡效果  默认情况下都已经启用了,如果需要手动启用则只需在Internet选项中: Advanced(高级) - Browsing(浏览) - Enable page transitions(启用页面过渡)即可。应用过渡效果  当我们需要添加过渡效果时,只需在<head>中添加一个特殊的...