[Vue]6. 动态路由 模拟新增文章功能

Vue 动态路由的实现(后台传递路由,前端拿到并生成侧边栏),其实就是路由在后台配置 前端请求接口后 生成路由表 最近刚结束一个项目,然后再客户的百般刁难下又增加了项目新需求: 后台传来当前用户对应权限的路由表,前端通过调接口拿到后处理(后端处理路由) vue项目实现动态路由的方式大体可分为两种: 1.第一种就是我们前端这边把路由写好,登录的时候根据用户的角色权限来动态展示路由,(前端控制路由) 详情可以看看这个人写的,感觉挺好的https://segmentfault.com/a/1190000009275424,我当时看这个项目看了好久才明白一点逻辑, 因为大神的动态路由那里有好多层判断,并且穿插各种vuex,把小 阅读详情

Demo:https://gitee.com/animalcoder/Vue/tree/master/vue6

版本:Vue-cli:4.2.9

效果:

可以新建文章   ↓

然后每个文章对应不同的动态url,对应不同title  content

 

 

添加动态路由思路:

1.Vuex维护List,List里是每个文章的  title , id, content

   Vuex维护一个id,表示当前文章id是多少,

   添加文章页面,每提交一篇文章,id+=1

2.新建一个组件X,当作文章的模板,根据url上不同的id 显示不同的title content

3.路由设置里url绑定id,组件为X

4.主页面列表List添加点击跳转事件

 

1.  store.js

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

let defaultlist=[{title1:"test",content1:"test",id:"1"}]
try {//
    if(localStorage.getItem("list1")){
        defaultlist=JSON.parse(localStorage.getItem("list1"))
    }
}catch(e){
}


let defaultid=2;
try {//
    if(localStorage.getItem("id1")){
        defaultid=JSON.parse(localStorage.getItem("id1"))
    }
}catch(e){
}

export default new Vuex.Store({
    state:{//状态
        lists:defaultlist
        ,  id:defaultid  
    },
    mutations: {  //更改事件

        addItems (state , value){
            state.lists.push(value)
            localStorage.setItem("list1",JSON.stringify(state.lists))
        },


    },
    actions: {

    },
    getters: {
        getTodoById: (state) => (id) => {
            return state.lists.find(todo => (todo.id == id))
        },
        getTodoById2:function(state,actions){  // == ===
            let x=function(id) {
                return  state.lists.find(todo => todo.id === id)
            }
            console.log("x"+x)
            return x;
        },
        // getTodoById2(id) { 
        //     return  this.state.lists.find(todo => todo.title1 === id)
        // }
    }


})

添加文章Son2.Vue页面:

<template>
    <div style="text-align:left">
        <h2>son2</h2>
        <p>标题</p>
        <input type='text' v-model="title"/>
        <p>内容</p>
        <textarea type='text' v-model='content' rows="5" cols="50"/>
        <br>
        <el-button  @click="add()">提交</el-button>
        <p v-if="sum>3">{{sum}}>3</p>
        <p v-else>{{sum}}<=3</p>
    </div>
</template>


<style scoped>
    
</style>


<script>
import store from '@/store' //引入store存储 (vuex)
export default {
    store,
    //data(){}里要 return{}
    data(){
      return {   
        title: '',
        content: '',
        sum:1,
      }
    },
    methods:{
        add(){
            let x=localStorage.getItem("id1") 
            x++;
            localStorage.setItem("id1",x);
            store.commit('addItems',{ title1: this.title,content1: this.content,id:x}) //调用store的方法 value传参
            
            this.title='';
            this.content='';
            this.$router.push('/Hellocopy/Son1'); 
        }
    }

}
</script>

2. 文章组件Test.Vue  核心是  let x = this.$route.params.id;获取url上的id

<template>
  <div>
    <h1>{{title}}</h1>
    <div >
      <el-row type="flex" justify="center">
        <el-col :span="15" >
          <el-card class="box-card" >
            <div style="min-height:500px">
                <p style="text-align:left">content:{{content}}</p>

            </div>
            
          </el-card>
        </el-col>
      </el-row>
    </div>

    <p>id:{{id}}</p>
    <!-- <button @click="getFuck()">123</button> -->
  </div>
</template>
<style scoped>

</style>

<script>
import store from "@/store"; //取出存储器里面的lists
export default {
  store,
  data() {
    return {
      title: "",
      content: "",
      id: ""
    };
  },
  methods: {
    getFuck() {}
  },
  mounted() {
    let x = this.$route.params.id;
    let ans = store.getters.getTodoById(x);
    console.log("ans" + ans);
    this.title = ans.title1;
    this.content = ans.content1;
    this.id = ans.id;
  }
};
</script>

 

3. main.js  核心是这句:{ path: '/user/:id',name:'/user/:id', component: Test }

import Vue from 'vue'
import App from './App.vue'
import HelloWorld from '@/components/HelloWorld'
import Hecopy from '@/components/Hecopy'
import ElementUI from "element-ui"
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)
import Test from '@/components/Test'

import  Son1 from '@/components/Son1'
import  Son2 from '@/components/Son2'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
 
const routes = [
    {path: '/',component: HelloWorld},
    {
      path: '/Hellocopy',
      name: 'Hellocopy',
      component: Hecopy,
      children: [
        {
          path: 'Son1',
          name: 'Son1',
          component:Son1 
        },
        {
          path: 'Son2',
          name: 'Son2',
          component:Son2
        }
        ,{ path: '/user/:id',name:'/user/:id', component: Test }//绑定url 与 id
      ]
    },
    {
        path: '/Test',
        name: 'Test',
        component:Test
    } 
    

]
const router = new VueRouter ({
  routes,
  //mode: 'history' //发布时把这个删掉
})
const User = {
  template: '<div>User {{ $route.params.id }}</div>'
}

Vue.config.productionTip = false

new Vue({
  el: '#app',
  router,
  render: h => h(App),
  data(){
    return{
        aa:123456
    }
},
}).$mount('#app')

4.主页面Son1.Vue  核心函数是Jump()

 Jump(id){
        this.$router.push('/user/'+id); 
 }
<template>
  <div class="test">
    <h2>son1</h2>
    <el-row :gutter="36" >
      <el-col :span="12">
        <el-card shadow="hover">
          <a :href="url">111</a>
          <p :title="url"></p>
        </el-card>
      </el-col>
      <el-col :span="12">
        <el-card shadow="hover">
          <div @click="Add(2,3)">123+{{Add(2,3)}}</div>

          <div>123+{{TestFunction("32")}}</div>
        </el-card>
      </el-col>
    </el-row>

    <el-row :gutter="36" type="flex" justify="center">
      <ul>
        
        <li v-for="(item,idx) in pageLists" :key="idx" style="color:black;">
          <!-- for 绑定 lists + 绑定下标 -->
          <!-- {{item.title1}}-{{item.content1}} -->
          
          <el-col :span="12" >
            <el-card shadow="hover" >
              <div style="height:200px">
                
                <el-image
      style="width: 100%; height: 200px;min-width:200px;opacity:0.9;"
      :src="url"
      :fit="fit"></el-image>
                
              </div>
              <div @click="Jump(item.id)"  class="bottom clearfix"> <p  class="title">{{item.title1}}</p></div>
             
            </el-card>
          </el-col>
        </li>
      </ul>
    </el-row>
  </div>
</template>

<style scoped>
body {
  color: black;
}
ul {
  list-style: none;
  margin: 0;
  padding: 0;
}
li {
  display: inline;
}
.el-col {
  margin-bottom: 20px;
}
.test {
  display: flex;
  flex-direction: column;
}
.title{
   font-size: 30px;
   text-align:left 
}
</style>


<script>
import store from "@/store"; //取出存储器里面的lists
export default {
  name: "List",
  store,
  computed: {
    //动态监听变化
    pageLists: () => store.state.lists
  },
  data() {
    return {

      a: 2,
      b: 3,
      sum: 0,
      url: "/img/12.jpg",
      fit:"cover",
      lists1: [
        { name: "123", age: "32" },
        { name: "1123", age: "323" }
      ]
    };
  },
  methods: {
    Add: (a, b) => {
      //console.log("???"+store.getters.getTodoById("123456"));
      return a + b;
    },
    TestFunction: function(id) {
      //不会报错 等价于 Add2()
      // console.log("store" + store + "com" + this.$options);
      let x = todo => todo.age === id;
      console.log(this.lists1.find(x));
      return this.lists1.find(function(todo) {
        return todo.age === id;
      });
    },
    Jump(id){
        this.$router.push('/user/'+id); 
    }
  },
  mounted() {
    console.log(this.$options);
    //localStorage.clear();
  }
};
</script>

 

 

 

Vue根据用户权限动态更新路由规则(附上案例及思路) 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar 阅读详情

相关推荐

详解Vue 动态添加模板的几种方法

本篇文章主要介绍了详解Vue 动态添加模板的几种方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

unity3D 碰撞检测例子代码

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Collisiotest : MonoBehaviour { private Renderer fuck; // Use this for initialization void Start () { ...

animalcoder 6482

5G NR PDCCH实战解析:从DCI格式到CORESET配置的完整指南

本文深入解析5G NR PDCCH的实战配置,涵盖DCI格式选择、CORESET配置及Search Space优化等关键内容。基于3GPP R16标准,提供现网部署中的典型问题解决方案,如覆盖边缘失步、多用户调度冲突等,帮助提升控制信令传输效率。特别针对5G NR PDCCH的灵活资源分配和自适应编码机制进行详细探讨。

weixin_29231263的博客 499

关于AVUE添加单页(添加文章,增加富文本编辑器)

AVUE项目实践

huzexuan的博客 1784

如何搭建pikachu靶场

Pikachu靶场本地搭建指南 下载安装PHPStudy并启动Apache/MySQL服务 获取Pikachu靶场源码并解压到网站根目录 配置数据库连接信息(修改config.inc.php文件) 创建pikachu数据库(用户名/密码设为root) 访问http://localhost/pikachu测试功能 常见问题:数据库连接失败需检查服务状态和配置信息,页面报错需检查PHP版本兼容性。建议使用PHP7.3/7.4版本,在隔离环境中搭建使用。 (150字)

2401_85351702的博客 1277

保姆级教程:用GROMACS 2022.4的拉伸模拟(SMD)加速蛋白-蛋白组装过程

本文详细介绍了如何使用GROMACS 2022.4的拉伸分子动力学模拟(SMD)技术加速大蛋白组装过程。通过CHARMM36力场和SMD技术,将传统需要数月的蛋白结合过程缩短至数天,大幅提升模拟效率。文章包含参数设计、索引组创建、周期性边界处理等实战技巧,并提供了完整的GPU加速工作流和常见问题解决方案。

weixin_30338481的博客 446

差分标记

所谓的差分标记可以用来解决多次区间修改,修改后出现若干查询的情况举个栗子:区间修改【l,r】+=c,标记lazy[l]++,lazy[r+1]--;那么修改完lazy的前缀和就是修改后的样子比如:现在有三个修改,初始都为0【2,4】+=1idx : 1 2 3 4 5lazy:0 1 0 0 -1前缀:0 1 1 1 0【3,4】+=1idx : 1 2 3 4 5lazy:0 1 1 0 -2前...

animalcoder 498

更多 LSTM 变种——应用于 CMAPSS 数据集

本文并模型介绍,只是把一些比较火的技术,像双向注意力机制,自注意力机制这样的比较火的内容,简单的和LSTM堆叠,结果发现效果都不如最基础的,这里作者将本人代码及实现结果,进行展示,给各位想更改LSTM的朋友一些。

2301_77491330的博客 1765

2018暑假ACM训练积累

7.19 牛客网多校第一场 A题,OEIS找规律 J题,莫队 B题经验题!:N个点度数均为2的无向图的数目,递推,组合数学 7.20 重新记忆线段树的板子,A了牛客网22的ABC跟Wannafly的水题 BZOJ4869,区间查加法和,区间更ai=c^ai%p,扩展欧拉定理+线段树 牛客网22E,扩展欧拉+线段树(未解决) 牛客网22C,bitset优化类背包思想,第一次用bit...

animalcoder 2061

使用同一个时钟源clki,做两个二分频时钟,得到div2_clk1和div2_clk2,这两个时钟都能跟源时钟clki同步,但是div2_clk1和div2_clk2的相位可能是相同的,也可能是反相

比如,触发器1的初始Q为0,而触发器2的初始Q为1(这可能由于芯片制造工艺的微小差异、上电过程的随机性、或没有全局复位信号导致)。这句话的意思是:虽然div2_clk1和div2_clk2都是由同一个妈妈(clki)生出来的,频率也都是妈妈的一半,但它们“起步”的时刻可能不同。所以,上面那段话是在提醒你注意这种潜在的、由分频产生的时钟相位关系的不确定性,这在异步电路设计或时钟管理中是必须考虑的关键因素。结果:div2_clk1和div2_clk2的波形完全重合,它们的上升沿和下降沿都发生在同一时刻。

m0_49540263的博客 592

基于STM32设计的智能水产养殖系统(华为云IOT)(152)

当前设计的智能水产养殖系统主控芯片采用STM32F103RCT6,可以实现对水位、水温、水混浊度和PH值等参数的监测和控制,并且支持定时投喂功能。通过连接华为云物联网平台,将传感器数据上传到服务器,并通过Qt设计的Android手机APP来获取设备上传的数据,从而实现对养殖环境的远程监测和控制。

8829

20171019莫比乌斯

ACACACAC

animalcoder 424

LangChain与LangGraph核心区别解析

LangChain与LangGraph是当前大语言模型(LLM)应用开发中两个紧密相关且极具影响力的开源框架。它们源于LangChain AI公司,设计哲学互补,旨在解决不同维度的LLM工程化问题,共同构成了构建复杂智能应用的强大工具集。

weixin_35774598的博客 1927

Vue3:动态路由+子页面(新增、详情页)动态路由配置(代码全注释)

emm,项目中使用动态路由实现根据后端返回的用户详情信息,动态将该用户能够访问的页面信息,动态生成并且绑定到路由对象中。但是后端返回的不包含像是页面详情页,新增页的权限路由,如果前端在路由对象中写死的话,那每次进入页面都得判断是否将进入一个用户没有权限的页面,但是路由中有存在的。3.GetPossibleDetails 根据传递过来的信息,筛选出存在权限的数据, 转换成路由信息,因为如果在本地中已经定义了全部的页面新增,详情,编辑等页面,但是咱们还是需要根据后端返回的权限中,判断咱们是否注册该页面的路由。

qq_45061461的博客 4156

SIMULINK开发项目实例 1000 例专栏之第912例--AC-DC整流器场景:基于PWM整流器拓扑结构的建模:三相电压型PWM整流器(SR)单位功率因数控制仿真

本文详细介绍了使用Simulink和Simscape Electrical搭建三相电压型PWM整流器(VSR)模型的方法。主要内容包括:系统结构设计、主电路拓扑搭建、单位功率因数控制算法实现(含PLL锁相环、dq变换、PI控制器等模块)、参数配置和仿真设置。通过仿真分析验证了该系统能实现输入电流与电压同相位、输出直流电压稳定等特性,体现了PWM整流器的高效性和低谐波优势。文章还提出了增强鲁棒性、多工况测试等优化建议,为电力电子系统设计提供了实用指导。该建模方法对新能源发电、电动汽车充电等领域具有重要意义。

xiaoheshang_123的博客 7798

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

vue-router动态路由实践

vue动态路由 vuex 路由数据(demo) 贡献本人于服务端约定的路由数据结构,仅供参考

Bennett_G博客 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

vue的静态路由和动态路由

vue路由vue中通过路由跳转的三种方式标签路由 router-linkthis.$router.push()this.$router.replace()ps : this. $ router.push()和this. $ router.replace()的区别前端路由实现原理主要通过利用H5的history API实现back、forward、go三个方法利用url的hash实现abstract模式静态路由与动态路由的区别优点:缺点: #mermaid-svg-a3FODESelaJ8znB8 .labe

weixin_47353884的博客 6455

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

vue3.x+element-plus 实现动态路由菜单功能

vue3.x+element-plus 实现动态路由菜单功能

zg_1234567的博客 9367

vue3实现动态菜单和动态路由和刷新后白屏处理

项目中,当每一个角色得到的界面不一致的时候,我们就不能使用静态菜单了,而是要从后端得到动态的菜单数据,然后动态的将菜单数据展示在界面上。除了在界面展示,也还要将界面的路由动态添加,在路由动态添加之后,你可能会出现刷新界面,界面变白的情况,页面刷新白屏其实是因为vuex引起的,由于刷新页面vuex数据会丢失,所以动态添加路由这一步也就失效了。这种情况我会在最后给一个处理方法。

bu_xiang_tutou的博客 7995

vue动态权限路由

vue动态权限路由

Jack, what else can you do besides holding your little darling? 3404

vue3 动态路由+动态组件+缓存应用

vue3 动态路由+动态组件+缓存应用

m0_51244077的博客 3263

Vue3+Vite+TypeScript+Element Plus开发-12.动态路由-动态增加路由

前一章节主要讲解了 Pinia 的持久化处理,而本章节则重点聚焦于动态路由的实现。在调试过程中,由于涉及较多细节,因此相关截图中包含了调试界面的内容。

sen_shan的专栏 1556

Vue.js与Nuxt.js:动态路由与中间件

在 Vue.js 中,动态路由通常是通过 Vue Router 插件来实现的。Vue Router 允许你在路由路径中使用动态段,这些段可以捕获 URL 中的部分,并将它们传递给组件作为参数。Vue.js 没有内置的中间件概念,但是你可以使用路由守卫来实现类似的功能。在 Vue.js 中,你可以使用嵌套路由来组织复杂的页面结构。如果你有一个动态路由。Nuxt.js 提供了中间件的概念,可以在页面加载之前执行一些逻辑,比如认证检查。首先,你需要安装 Vue Router 并在你的项目中配置它。

天涯学馆 1955

vue路由,动态路由,嵌套路由

vue路由 vue是一个单页面应用 我们页面其实是由组件组成 我们想要是要页面到页面之间跳转 我们只能通过vue组件进行模拟页面之间跳转 跳转过程 我们就需要使用vue-router 使用: 1 使用npm安装 npm install vue-router --save-dev 2 使用cdn进行外部引入 https://unpkg.com

夜空孤狼啸的博客 1214

vue 实例之路由,动态路由,嵌套路由,命名路由,命名视图

认识路由 路由的本质是一种 对应关系 ,程序开发分为前端路由和后端路由。url 地址和真实的资源之间就有一种对应的关系,就是路由 。 什么是前端路由 前端路由就是把不同路由对应不同的内容或页面的任务交给前端来做。对于单页的应用(SPA)来说,主要通过 URL 中的 hash (#号)来实现不同页面之间的切换。hash 有一个特点,就是 HTTP 请求中不会包含 hash 线管的内容,所以单页面程序中的页面跳转主要用 hash 来实现。前端路由是依靠 hash 值(锚点链接)的变化来实现页面内容的切换,也就是

余憨憨的学习日记 2273

vue3+pinia+vuerouter4动态路由菜单

最近在做一个通用后台管理系统的框架,通过用户登录拿取用户的权限和菜单列表数据来动态添加路由,使不同用户的显示不同左侧菜单列表。这篇文章主要是讲述通过vue3+router+pinia技术栈设置动态路由菜单。

学如逆水行舟,不进则退! 1万+
上一篇: [Vue] 5. 试试Vuex
下一篇: [springboot] 异步+定时任务的坑
animalcoder
博客等级 码龄9年 43粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值