- 凡尘
-
1,首先获取到后端返回给我们的权限数据,数据大概长这么个样子。
2,要渲染到element的树形结构上的话,要做一层递归处理,让它形成树形结构。这个也可以不用递归,我看他们用map这个属性,也能很好的处理。具体做法如下:
这个数据渲染好以后,是长这样的,也就符合了我们el-tree组件所需的数据结构。
3,现在管理员开始在管理界面开始做权限管理操作。如图所示:
这样的话返回给后端的是一个id组成的数组, data=[1,4,10] 这就是你返回给后端的数据 ,还没完接下来该复现了。
4,现在后端给数据返回给你,他是按照刚才你给的数据返回过来的。然后添加上check属性,这个也是你们约定,数据大概就长这样:
你可能还在想不错,不错。还不用递归,循环就给数据拿了。当你拿到所有的数组check为true的数据组成的数组treelist,然后 this.$refs.tree.setCheckedKeys(this.treelist) 上去时,已经不符合要求了,因为父集全选,子集就会全选。他会变成这样:
5,这样肯定不行,我们要再做一次数据处理,让它符合要求。1, 要给数据再次递归成树形结构 ,还是上面的方法给数据递归成树形结构。2,遍历这个树形结构,判断父集的子集是否全部为true,如果不是就就让他的check属性设置为false,
这里说明一下。this.state 这个变量你要自己设置一下或者全局变量都行,反正要设置一下,设置为true。首先我们给递归好的树形结构放在 traveData 这个函数里面这个函数会递归一遍我们的数据,主要是判断
item.check = item.children.length > 0 ? this.getchildStatus(item.children) : item.check
这里是判断他有没有子集,没有的话就是ok,那么check的值就是合理的,如果他有子集但是它的check为true这就很不合理,因为我们不知道他的子集到底是不是都是选了的,也就是check为true,所以要做一层碰断,判断他的子集是否全为true,只要他的子集有一个不为true,那它就不能为true this.getchildStatus(item.children) 所以这里又做了一层,遍历他的所有子集。判断check的值。ok做到这里我们大概也差不多了。拿到 return data 的值我们还要做一次数据的递归,
6,至此,我们已经拿到了 this.treelist的值我们只要
这样就可以把我们的树形结构又从新渲染好了。数据用的都是模拟数据,但是和业务场景的数据其实差别不大,只要按照这个流程就ok了。不管是element,antd,我觉得这个全选和半选感觉还可以优化下。不是真的挺绕的。
vue3中使用scss全局变量
1、安装库: sass-resources-loader 安装命令 install sass-resources-loader --save-dev 2、vue.config.js 配置 3、已经可以在任何组件中,使用全局变量了2023-06-06 05:30:261
2022-03-03 vue3中使用全局变量
对比: 在vue2.x中我们挂载全局变量或方法是通过是使用 Vue.prototype.$api=xxx 的形式来挂载,然后通过 this.$xxx 来获取挂载到全局的变量或者方法 但是 在vue3.x中显然是不行滴,在setup里面我们都获取不到this,但是 别怕 vue3.x官网给我们提供了新的方法 叫: globalProperties 。添加一个可以在应用的任何组件实例中访问的全局 property 。组件的 property 在命名冲突具有优先权 用法: 比如我们挂在一下我们的axios 在main.ts上 在我们页面上引用:2023-06-06 05:30:331
vue cli3.0配置全局变量
首先我们在配置文件里肯定会用到process.env.NODE_ENV,这个对象我们在全局都可以访问到,那么假如说我们要在build的时候判断是否要打离线包的话,就需要添加一个变量来进行设置。这里我们就记录一下这种情况如何处理吧 首先我们在项目根目录下创建一个.env的文件,然后写入变量的key和对应的值 这样我们就可以全局访问了,是不是很简单呢!2023-06-06 05:30:391
vue组件如何使用全局变量
定义全局变量原理:设置一个专用的的全局变量模块文件,模块里面定义一些变量初始状态,用export default 暴露出去,在main.js里面使用Vue.prototype挂载到vue实例上面或者在其它地方需要使用时,引入该模块便可。全局变量模块文件:Global.vue文件:使用方式1:在需要的地方引用进全局变量模块文件,然后通过文件里面的变量名字获取全局变量参数值。在text1.vue组件中使用:使用方式2:在程序入口的main.js文件里面,将上面那个Global.vue文件挂载到Vue.prototype。import global_ from "./components/Global"//引用文件Vue.prototype.GLOBAL = global_//挂载到Vue实例上面接着在整个项目中不需要再通过引用Global.vue模块文件,直接通过this就可以直接访问Global文件里面定义的全局变量。text2.vue:Vuex也可以设置全局变量:通过vuex来存放全局变量,这里东西比较多,也相对复杂一些,有兴趣的小伙伴们,可自行查阅资料,折腾一波、定义全局函数原理新建一个模块文件,然后在main.js里面通过Vue.prototype将函数挂载到Vue实例上面,通过this.函数名,来运行函数。1. 在main.js里面直接写函数简单的函数可以直接在main.js里面直接写组件中调用:2. 写一个模块文件,挂载到main.js上面。base.js文件,文件位置可以放在跟main.js同一级,方便引用main.js入口文件:组件里面调用:后话上面就是如何定义全局变量 全局函数的内容了,这里的全局变量全局函数可以不局限于vue项目,vue-cli是用了webpack做模块化,其他模块化开发,定义全局变量、函数的套路基本上是差不多。2023-06-06 05:30:531
vue定义全局变量,以及方法的调用
记录一下自己忘记的东西,省的下回到处找。 在vue项目中经常会用全局的变量,或者定义全局的方法 首先新建一个utils.js的文件,里面放上你需要的全局方法以及变量呀 举个例子 完事之后呢? 在main.js里面申明一下哈 这样你就可以全局使用啦!再需要的地方你就写 变量的话同理哟! 下班下班~~2023-06-06 05:30:591
vue 设置了全局变量,要怎么在组件使用中修改它
在main.js 中引入 config.jsimport defines from "./config"Vue.prototype.defines = definesconfig.js 的内容如下:export default { name: "Who", sex: "Male", setname (newName) { this.name = newName console.log("姓名已经改变") }}然后在调用全局变量的vue的html中加入:{{ this.defines.name }}就可以显示全局变量了。修改的方法为:在调用全局变量的vue的script中加入:this.defines.setname("小强")console.log(this.defines.name)就能修改了。2023-06-06 05:31:061
vue怎么全局定义一个变量代替路径
使用全局变量模块文件来进行定义,Vue为3D自然环境的动画制作和渲染提供了一系列的解决方案。重新定义了变量替代路径。2023-06-06 05:31:121
vue3中vite的配置
上一节 - 搭建vue3+typescript+vite+yarn项目 在vue2里,我们使用webpack打包工具,一些基本配置我们都是熟悉不能再熟悉,但在vite里,有什么不同呢? 参考链接 - vite 中文文档 vue2里,针对webpack的配置,是基于vue.config.js文件 但在基于vite的vue3里,配置文件是vite.config.js 我构建的是ts版本的vue3项目,那么我的配置文件就是vite.config.ts 而且该文件项目创建的时候已经默认生成了 新创建的项目配置文件,仅仅配置vue的支持,如下: 配置反向代理,利用 server配置项 配置项一目了然,跟vue2的vue.config.js的配置大同小异 这里主要说明下,我proxy里的config config变量来源于全局变量 这需要在根目录下创建两个命名为:.env.development、.env.production的文件 编写相关的变量: vue2中使用习惯了开箱即用的路径别名,但在vue3的ts项目里,如果直接使用,是会报错的: 这样配置后,引入组件就能正常被编译了 下一节 - vue3中引入router和vuex2023-06-06 05:32:051
main.js中Vue.prototype定义全局变量
uni-app项目,在main.js文件中使用Vue.prototype方法挂载一个可用于全局页面的变量 通过这个方法,可以在其他页面直接进行使用 ./store/index.js: ./store/getters.js: 其它页面获取存储的signingDataList值:2023-06-06 05:32:111
vue2.0 全局变量怎么设置
vue2.0设置全局变量的源码如下:VUE介绍:Display Options显示选项:包括线框显示选项框,填充框,线框,平面阴影和平滑阴影。每个对象及显示窗口均可以对这些选项进行单独设置。雾,场景灯光,阴影和视频帧导游也可以启用Open GL的显示。Dynamic Plant Display Optimization动态植物表现优化:植物预览质量可以根据表现植物的数量与复杂性,和用户设置如目标帧率,在全球基础上进行动态调整。在您在显示选项中设置的限制范围内,引擎会尽量表现最多植物细节。OpenGL Sky Preview with Clouds OpenGL的天空与云预览:天空预览使用逐步细化方法来提供细节逐渐丰满的天空与云的画面 (为获得最佳效果,此预览采用多CPU计算)。如需要,云预览可以禁用。现在相机曝光在OpenGL中可以自动体现,以提供更精确的场景预览 (仅限着色器引擎)。此选项亦可禁用。Interactive Cloud Control交互式云控制:云图层可用类似常规对象的处理方式处理。当图层在世界之窗浏览器中出现时,可以用标准操作线框对其进行移动,旋转和更改尺寸。您也可以用Vue的标准动漫制作工具来控制云的运动和速度。2023-06-06 05:32:291
vuex和全局变量的区别
每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同: 1.Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。 2.你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用 参考文章: https://blog.csdn.net/maidu_xbd/article/details/104895641 参考文章: https://www.cnblogs.com/tangjiao/p/9013342.html2023-06-06 05:32:411
vue安装脚手架时候怎么卸载全局变量
这个应该好理解啊,就像悬挑式脚手架,搭设高度不得超过20m,而这20m就可以看做一个分段,其受力卸载在底部悬挑梁上。部分卸载就是如果底部悬挑梁无法承受上部荷载时你可以使用斜拉钢丝绳卸载上部的荷载以分载。2023-06-06 05:32:561
webpack 配置scss||less全局样式(自定义的,vue-cli2/3)
一般的,引入全局设置的基本样式 这样在引入scss文件中可以使用 base 里的全局变量 但是 避免在资源文件中使用SASS @ import 规则,因为它会降低增量构建的速度。直接在webpack config 中的 sassResources 数组中添加导入的文件。 以 scss 为例, 在自己配的webpack,和vue-cli2/3中配置全局样式引入 ( sass-resources-loader 也可以用来配置 less ) 确保package.json有 node-sass , sass-loader , style-loader 安装 sass-resources-loader sass-resources-loader 再在配置中更改 安装 sass-resources-loader 修改build中的utils.js 安装 sass-resources-loader 修改build中的utils.js vue.config.js 不需要安装 sass-resources-loader 只需要确保安装了 node-sass sass-loader 有些会报错 这样配置后在 直接使用 vue.config.js 确保安装了 node-sass sass-loader vue.config.js2023-06-06 05:33:021
vue限制data的数据类型
定义data数据类型的三种函数:(一)定义为属性(二)定义为函数(三)定义为函数,满足ES6(ECMAScript 6.0 )规范在简单的vue实例应用中,三种写法几乎是没有什么区别的,因为你定义的#yanggb对象不会被复用。但是如果是在组件应用的环境中,就可能会存在多个地方调用同一个组件的情况,为了不让多个地方的组件共享同一个data对象,只能返回函数。这个与JavaScript的作用域特性有关,函数自己拥有私有的作用域,函数之间的作用域相互独立,也就不会出现组件对数据的绑定出现交错的情况如果vue的data数据用的是全局变量,变量是普通数据类型,那么当全局变量的值发生改变的的时候,那么data中用的这个值是不会发生改变的,也无法触发视图更新 ,因为是普通数据类型解决:全局的普通数据类型改为引用数据类型Vue (读音 /vju_/,类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用(SPA)提供驱动。2023-06-06 05:33:091
前端vue问题,v-if动态更新视图问题,响应式问题?
建议贴图片,这排版看不了2023-06-06 05:33:152
20《Vue 入门教程》Vue 插件
本节我们将介绍 Vue 的插件。包括什么是插件、如何使用插件、如何编写一个简单的插件。其中,编写和使用插件是本节的重点。本节我们将带领大家写一个简单的插件示例,同学们在学完本节后可以尝试编写其他的插件来加深学习。 Vue 插件是对 Vue 全局功能的扩展,他可以给 Vue 添加全局方法、属性、组件、过滤器、指令等等。 通过全局方法 Vue.use () 使用插件。它需要在你调用 new Vue () 启动应用之前完成: 也可以传入一个可选的选项对象: Vue.use 会自动阻止多次注册相同插件,即使多次调用也只会注册一次该插件。 Vue.js 官方提供的一些插件 (例如 vue-router) 在检测到 Vue 是可访问的全局变量时会自动调用 Vue.use ()。然而在像 CommonJS 这样的模块环境中,你应该始终显式地调用 Vue.use (): awesome-vue 集合了大量由社区贡献的插件和库。 Vue.js 的插件应该暴露一个 install 方法。这个方法的第一个参数是 Vue 构造器,第二个参数是一个可选的选项对象: 接下来,我们写一个具体的插件示例: 实例演示 "运行案例" 可查看在线运行效果 代码解释: JS 代码第 3-20 行,我们定义了插件 MyPlugin,该插件中包含一个全局组件 MyButton。 JS 代码第 22 行,通过 Vue.use 使用 MyPlugin。 HTML 代码第 2、4、6、8、10 行,使用 MyPlugin 插件中的 MyButton 组件。 本节,我们带大家学习了 Vue 插件的使用方式。主要知识点有以下几点:2023-06-06 05:33:281
vue怎么实现访问第三方 api
在 Vue.js 中使用第三方库的方式有:1.全局变量在项目中添加第三方库的最简单方式是讲其作为一个全局变量, 挂载到 window 对象上:entry.jswindow._ = require("lodash");MyComponent.vueexport default {created() {console.log(_.isEmpty() ? "Lodash everywhere!" : "Uh oh..");}}这种方式不适合于服务端渲染, 因为服务端没有 window 对象, 是 undefined, 当试图去访问属性时会报错.2.在每个文件中引入另一个简单的方式是在每一个需要该库的文件中导入:MyComponent.vueimport _ from "lodash";export default {created() {console.log(_.isEmpty() ? "Lodash is available here!" : "Uh oh..");}}这种方式是允许的, 但是比较繁琐, 并且带来的问题是: 你必须记住在哪些文件引用了该库, 如果项目不再依赖这个库时, 得去找到每一个引用该库的文件并删除该库的引用. 如果构建工具没设置正确, 可能导致该库的多份拷贝被引用.3.优雅的方式在 Vuejs 项目中使用 JavaScript 库的一个优雅方式是讲其代理到 Vue 的原型对象上去. 按照这种方式, 我们引入 Moment 库:entry.jsimport moment from "moment";Object.defineProperty(Vue.prototype, "$moment", { value: moment });由于所有的组件都会从 Vue 的原型对象上继承它们的方法, 因此在所有组件/实例中都可以通过 this.$moment: 的方式访问 Moment 而不需要定义全局变量或者手动的引入.MyNewComponent.vueexport default {created() {console.log("The time is " . this.$moment().format("HH:mm"));}}2023-06-06 05:33:351
VUE:在 vue 3.x 中使用 i18n
vue 3.x 已经发布一段时间了,如果你在使用,并且有国际化的需求,希望本文能帮到你。 在 vue 中配置国际化,一般使用 vue-i18n。由于目前 v8 版本的 vue-i18n 仅支持 vue 2.x,这里我们需要安装 9 或以上的版本。 NPM: Yarn: PNPM: npm 会自动判断你的 Vue 版本,如果不是 3.0 以上的版本,则会报错: 其他方法可以查看官网: https://vue-i18n.intlify.dev/installation.html 安装完成之后,就可以创建 i18n 实例了,这里可以根据自己的喜好,在任何地方创建。 为了方便管理,我是在 src/i18n/index.ts 创建。 创建好之后,就可以在入口文件引入了。vue 3.x 的入口文件默认是根目录下的 main.ts 或 main.js 。 引入之后,就可以使用了。使用方法和 vue 2.x 一样,都是通过 $t 方法获取语言包中的值。 渲染后的结果: 到这里就大功告成!2023-06-06 05:33:521
vue3为什么取消全局事件总线
安全性低。在vue3中,取消全局事件总线的原因是安全性低导致的。Vue3是一套构建用户界面的渐进式框架。Vue只关注视图层,采用自底向上增量开发的设计。2023-06-06 05:33:581
vue3.0有哪些新特性
vue3.0新特性有: 1、性能比vue2.x快1.2 2倍- Performance ; 2、支持tree-shaking- Tree shaking support ; 3、引入了Composition API- Composition API ; 4、暴露了自定义渲染API- Custom Renderer API ; 5、新增三个组件(Fragment、Teleport、Suspense); 6、 更好的支持TS - Better TypeScript support; 一、Performance 二、 Three-shaking support Vue3.x中的核心API都支持tree-shaking,这些API都是通过包引入的方式而不是直接在实例化时就注入,只会对使用到的功能或特性进行打包(按需打包),这意味着更多的功能和更小的体积。 三、Composition API Vue2.x中,我们通常采用mixin来复用逻辑代码,使用起来虽然方便,但也存在一些问题:代码来源不清晰、方法属性可能出现冲突。因此,Vue3.x引入了Composition API(组合API),使用纯函数分割复用代码。和React Hooks的概念相似。 四、 Fragment、Teleport、Suspense Fragment 在书写Vue2.x时,由于组件必须是一个根结点,很多时候会添加一些没有意义的节点用于包裹。Fragment组件就是用于解决这个问题的(这和React 中的Fragment组件是一样的)。 Teleport Teleport其实就是React中的Portal。Portal 提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案。 五、API- Custom Renderer API vue官方实现的 createApp 会给我们的 template 映射生成 html 代码,但是要是你不想渲染生成到 html ,而是要渲染生成到 canvas 之类的不是html的代码的时候,那就需要用到 Custom Renderer API 来定义自己的 render 渲染生成函数了。2023-06-06 05:34:061
vue process的疑惑
process官方给出的解释是:process 对象是一个全局变量,它提供有关当前 Node.js 进程的信息并对其进行控制。 作为一个全局变量,它始终可供 Node.js 应用程序使用,无需使用 require()。 最近项目中有一个需求就是展示图片,但图片服务器时另外一个,也就是说我展示图片的时候我要拼上另外一个服务器的地址。 这个时候肯定想到在dev.js中配置图片服务器地址,和其他一样 这个时候使用,却用不了 报错如下: 看了很多资料都无法理解为什么报这个错 然后我尝试打印process.env 报错包的更看不懂了 Vue warn]: Error in data(): "ReferenceError: dev is not defined" 我再尝试打印process 可以打印的,但是env时空的 又开始各种百度啊,google啊,无解 然后我突然想起来,页面的请求时正常的,但是请求用到了process.env.BASE_API 我又尝试打印BASE_API,发现竟然可以 这个时候我就郁闷了,我就开始一个字一个字的对配置文件 发现IMAGE_API和ENV_CONFIG都少了一个单引号 加上 尝试打印 很完美 但是有一个疑惑就是为什么process下的env仍然是空的 直接打印process.env是有值的,这个很奇怪,我还没有找到原因。找到原因再来补充吧2023-06-06 05:34:121
vue3 批量注册全局组件(共用组件)
main.js 中引入 就可以了! main.js 中引入 就可以了! vue2的时候 vue3 用vite不能使用require.context,要使用import.meta.globEage2023-06-06 05:34:181
Vant前端框架
Vant 轻量、可靠的移动端 Vue 组件库 Vant 是一个 轻量 、 可靠的移动端组件库 ,于 2017 年开源。 目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本,并由社区团队维护 React 版本和支付宝小程序版本。 文档:V2开发手册: https://vant-contrib.gitee.io/vant/v2/#/zh-CN/ 特性: 通过 npm 安装 .在现有项目中使用 Vant 时,可以通过 npm 或 yarn 进行安装: 通过 CDN 安装 .使用 Vant 最简单的方法是直接在 html 文件中引入 CDN 链接,之后你可以通过全局变量 vant 访问到所有组件。 通过 脚手架安装 .在新项目中使用 Vant 时,推荐使用 Vue 官方提供的脚手架 Vue Cli 创建项目并安装 Vant。 Vue脚手架(创建、了解结构、运行流程),不清楚vue怎么创建请点击 打开 Dos命令窗口 ,使用下面命令创建Vue 添加安装Vant支持 项目创建完毕后,并不直接支持vant,我们需要将Vant的内容添加安装到当前Vue项目 添加引用 启动项目的命令 Vant 支持多种组件注册方式,请根据实际业务需要进行选择。 全局注册后,你可以在 app 下的任意子组件中使用注册的 Vant 组件。 局部注册后,你可以在当前组件中使用注册的 Vant 组件。 Vant 中的许多组件提供了实例方法,调用实例方法时,我们需要通过 ref 来注册组件引用信息,引用信息将会注册在父组件的 $refs 对象上。注册完成后,我们可以通过 this.$refs.xxx 访问到对应的组件实例,并调用上面的实例方法。 Vant 默认使用 px 作为样式单位,如果需要使用 viewport 单位 (vw, vh, vmin, vmax),推荐使用 postcss-px-to-viewport 进行转换。 postcss-px-to-viewport 是一款 PostCSS 插件,用于将 px 单位转化为 vw/vh 单位。 下面提供了一份基本的 PostCSS 示例配置,可以在此配置的基础上根据项目需求进行修改。 表单组件 使用表单组件实现登录页面,是Vant直接提供的组件 向vue文件中复制文档中提供的代码 注意复制的位置,我们以AboutView.vue为例 然后直接访问about页面即可 area省市区选择 我们在手机app上经常需要选择省市区 Vant直接提供了这个组件 我们创建AreaView.vue文件 别忘了要设置路由才能访问这个页面 router文件夹下的index.js文件中添加路由代码 然后可以通过输入路径 localhost:8080/area访问这个页面 但是我们现在只能访问我们数组中定义的少数省市区 怎么才能想文档中显示所有省市区呢 需要引用官方提供的一个地址列表 这样就安装了所有省市区的数据到当前的项目 我们只需要修改js代码,让arealist引用这个数据内容即可 商品列表页 我们在开发酷鲨商城的过程中 移动端需要很多页面,商品列表页面是比较常见的页面之一 我们以商品列表页为例 带领大家开发一个页面 创建页面和路由配置 router/index.js添加路由信息 创建ListView.vue 添加事件调用的参考代码2023-06-06 05:34:361
vue3中创建新项目中配置失败
您要问的是vue3中创建新项目中配置失败的原因是什么?原因是VueCLI版本的问题,Node.js版本的问题,网络连接问题,本地环境问题。1、VueCLI版本的问题:Vue3需要使用VueCLI4.5.0及以上版本,如果使用的是旧版本的VueCLI,可能会导致配置失败。可以通过在终端中运行vue--version命令来检查VueCLI的版本,并通过运行npminstall-g@vue/cli来更新VueCLI。2、Node.js版本的问题:Vue3需要使用Node.js12及以上版本,如果使用的是旧版本的Node.js,可能会导致配置失败。可以通过在终端中运行node--version命令来检查Node.js的版本,并通过安装最新版本的Node.js来更新。3、网络连接问题:如果网络连接不稳定或存在其他网络问题,可能会导致Vue3创建新项目时配置失败。可以尝试重新连接网络或更换网络环境,以确保网络连接正常。4、本地环境问题:如果本地环境存在问题,如缺少必要的依赖项或配置文件,可能会导致Vue3创建新项目时配置失败。可以尝试重新安装VueCLI,或者检查本地环境配置,确保符合Vue3的要求。2023-06-06 05:34:431
在vue(vue-cli3)项目中使用链判断?.、null ??判断运算符报错
在vue项目中使用es6新的 运算符 (例如链判断运算符,null判断运算符)会报错,编译不成功 需要安装babel依赖,并添加到babel.config.js中。 1.安装依赖 2.在babel-config.js添加配置2023-06-06 05:34:551
小白研究项目部署-关于vue项目部署遇到的一些问题
在搞清root,alias,try_files的基本用法后,我开始尝试vue项目的部署。 (用法我之前的文章也研究过) 此前,听说挺多小伙伴会遇到vue-router-history模式种种问题,比如路径无法匹配,找不到静态资源,刷新页面404,etc... 不急,只要找到原因,问题是可以迎刃而解的。 项目部署环境一般可以分为三种:生产环境,测试环境,开发环境。 开发环境 :开发环境时程序员专门用于开发的服务器,配置可以比较随意,为了开发调试方便,一般打开全部错误报告和测试工具,是最基础的环境。 生产环境 :生产环境是指正式提供对外服务的,一般会关掉错误报告,打开错误日志,是最重要的环境。部署分支一般为master分支。 测试环境 :一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常,那么肯定不能把它发布到生产服务器,是开发环境到生产环境的过渡环境。 测试环境的分支存在bug,一般不会让用户和其他人看到,并且测试环境会尽量与生产环境相似。 如何区分生产环境和开发环境? process.env.NODE_ENV 是 node 的全局变量 process 的一个属性,它的作用是区分当前环境是生产环境还是开发环境, 可以参考学习: 理解webpack中的process.env.NODE_ENV 其实一般的vue单页面应用项目中,遇到路径无法匹配,或者资源引用错误问题都是由于以下几个属性造成的,如果你经常翻官网文档,那看到这里应该就已经会意,他们分别是: 接下来我将讲解以下这几个属性的使用。 依照官网的解释,贴一张用法图: 当使用基于 HTML5 history.pushState 的路由时,“相对 publicPath” 会受到限制,即是说在使用history模式时,publicPath需要设置为绝对路径。那么在vue.config.js文件中,你应该这样配置: 在nginx配置文件中你就需要这样配置: 假设我的项目名为history,并且放在/usr/local/webserver/nginx/myProject 目录下,如tree图 示例贴一下: 珂朵莉的服务器 (点击about会使用路由跳转) 如果你的配置出现页面空白,或者404访问错误,资源引用问题(F12可观察),这时你就要检查publicPath,assetsDir甚至是nginx有没有配置正确了。 我觉得原因是页面刷新时,服务器找不到任何的静态资源,就报404,那么解决办法就简单了: 你要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。即使用try_files 寻找index.html。 可以参考本项目的nginx配置: 但如此配置后,你的服务器就不再返回 404 错误页面,因为对于所有路径都会返回 index.html 文件。为了避免这种情况,你应该在 Vue 应用里面覆盖所有的路由情况,然后在给出一个 404 页面。 参考官网例子: 另一方面,有可能是Vue-Router没有配置好,需要注意初始化Router时候的base参数: 如此项目部署就完成了。 感谢博哥指出之前文章错误之处,已经修正,谢谢2023-06-06 05:35:201
uniapp实现全局变量
1.引入外部js文件引入全局常量-组件引用全局变量 2.main.js入口文件挂载全局变量-this引用全局变量 main.js入口类文件 Vue.prototype属性全局挂载 自定义属性2023-06-06 05:35:261
vue3historyhash可以共存吗
不可以。vue3的history和hash是两种不同的模式,不可以共存。history和hash都是利用浏览器的两种特性实现前端路由,history是利用浏览历史记录栈的API实现,hash是监听location对象hash值变化事件来实现。2023-06-06 05:35:331
Vue配置全局变量,配置监听回调
1.自定义一个全局变量js文件,命名为g_data 2.在main.js中通过prototype挂载到vue上 至此已经可以使用this.g_data 来访问全局对象了。 需要监听回调,修改g_data.js 为: 3.在vue组件中使用场景: 通过 emit和$on触发,执行其他组件的函数事件。2023-06-06 05:35:511
vue3全局注入和使用
vue2.x挂载全局是使用Vue.prototype. xxx来获取挂载到全局的变量或者方法 vue3.x挂载全局config.globalProperties2023-06-06 05:35:571
如何在.vue文件中访问Vue全局变量
导入Vue即可:import Vue from "vue";export default {mounted(){Vue.myGlobalMethod();}}2023-06-06 05:36:042
在Vue3中引入echarts
1.引入echarts5的方式与之前的版本方式不一样 2.将echarts5添加到全局变量2023-06-06 05:36:101
Vue的process.env设置全局变量不生效问题
在.env.development文件中设置全局变量的时候发现并没有生效。2023-06-06 05:36:171
vue3 全局组件 及 ts 提示
index.ts 内容: 或采用 install 注册全局 【推荐】 main.ts 内容: 若采用 install 方式注册全局,则用 app.use 方式来注册 components.d.ts 内容:2023-06-06 05:36:241
组件动态挂载 Vue 3
创建一个div 把div放在body里面,然后把Dialog组件放在div里面。 给Dialog传值为ture,使用h函数 用法:2023-06-06 05:36:301
什么是vue插件,vue插件怎么使用?
插件通常用来为 Vue 添加全局功能。插件的功能范围没有严格的限制——一般有下面几种: 通过全局方法 Vue.use() 使用插件。它需要在你调用 new Vue() 启动应用之前完成: 为防止 多次注册同一个插件: 我们可以传递一个可选的对象 Vue.use 会自动阻止多次注册相同插件,届时即使多次调用也只会注册一次该插件。 Vue.js 官方提供的一些插件 (例如 vue-router) 在检测到 Vue 是可访问的全局变量时会自动调用 Vue.use()。然而在像 CommonJS 这样的模块环境中,你应该始终显式地调用 Vue.use():2023-06-06 05:36:361
vue2.0 全局变量怎么设置?
vue2.0设置全局变量的源码如下:VUE介绍:Display Options显示选项:包括线框显示选项框,填充框,线框,平面阴影和平滑阴影。每个对象及显示窗口均可以对这些选项进行单独设置。雾,场景灯光,阴影和视频帧导游也可以启用Open GL的显示。Dynamic Plant Display Optimization动态植物表现优化:植物预览质量可以根据表现植物的数量与复杂性,和用户设置如目标帧率,在全球基础上进行动态调整。在您在显示选项中设置的限制范围内,引擎会尽量表现最多植物细节。OpenGL Sky Preview with Clouds OpenGL的天空与云预览:天空预览使用逐步细化方法来提供细节逐渐丰满的天空与云的画面 (为获得最佳效果,此预览采用多CPU计算)。如需要,云预览可以禁用。现在相机曝光在OpenGL中可以自动体现,以提供更精确的场景预览 (仅限着色器引擎)。此选项亦可禁用。Interactive Cloud Control交互式云控制:云图层可用类似常规对象的处理方式处理。当图层在世界之窗浏览器中出现时,可以用标准操作线框对其进行移动,旋转和更改尺寸。您也可以用Vue的标准动漫制作工具来控制云的运动和速度。2023-06-06 05:36:431
vue webpack main.js 里面能设置全局变量吗
当然,开始前先确保已成功安装node.js和npm(网上都有相应教程这里不做过多说明)。1.创建项目基本文件结构创建一个项目叫做MyA p p在一个空白文件夹中。它将会作为整个项目的根目录。 cmd命令进入到MyA p p文件夹。2023-06-06 05:36:551
Vue 3单文件驱动的CSS变量(新版语法)是怎么回事
本文已经假设你熟悉CSS变量,如果不熟悉,可以看我写的CSS变量基础知识: https://www.jianshu.com/p/a0f6233cf335 在研究Vue 3的“单文件驱动的CSS变量”之前,我们先看看Vue 2怎么使用CSS变量。 :style是行内样式,行内样式的缺点至少有三个:1. 字符多,写起来麻烦;2. 行内意味着无法复用,class可以复用;3. :style无法定义伪元素的样式。 CSS变量优势其实很明显,上面案例中, <div class="a-container">A元素</div> 并没有写style,而且, a-container 是可以复用的,可以用在无数个元素上。最后,在<style>标签里可以定义伪元素的样式。 Vue 3加入了“单文件驱动的CSS变量”,它也是一种语法糖,到今天有2个版本,旧版简称“style vars”版本,因为被人诟病“创造了方言”而改成了新版,旧版我就不说了,新版用法举例: 也就是说,凡是<style>中使用了v-bind函数,都将传值视为CSS变量表达式,而且缺省 -- 符号。变量会自动去<script setup>里查找同名顶层变量。 拼接字符串要遵循CSS变量规范,CSS变量规范并没有直接拼接字符串的办法,而是采用calc乘法。 写起来是对象的点运算符,但是要用引号包裹起来,而且为了跟CSS常用的双引号区分,最好使用单引号。 Vue 2的写法在3里依然可用,而且更贴近原生,可以说是标准写法,而Vue 3实际上是2的语法糖。 方便程度上说,Vue 3的肯定更方便。 由于使用CSS变量,所以IE全不支持,老内核Edge全不支持。2023-06-06 05:37:191
uni-app使用Vue.js
说明 :uni-app基于 Vue 2.0 实现,开发者需注意Vue 1.0 -> 2.0 的使用差异,详见 从 Vue 1.x 迁移 。 uni-app不仅支持应用生命周期和页面生命周期,还支持 vue 实例的如下生命周期函数: 注意 :不要在选项属性或回调上使用箭头函数,比如 created: () => console.log(this.a) 或 vm.$watch("a", newValue => this.myMethod())。因为箭头函数是和父级上下文绑定在一起的,this 不会是如你做预期的 Vue 实例,且 this.a 或 this.myMethod 也会是未定义的。 几乎全支持 Vue官方文档:模板语法 ,下面讲下不支持的情况。 (1)不支持纯HTML uni-app的非H5端里所有的 BOM/DOM 都不能用,也就是说 v-html 指令不能用,可以使用 rich-text组件 代替。或者使用三方组件wxparse,在hello uni-app中有示例。 (2)不支持部分复杂的 JavaScript 渲染表达式 非H5端无法支持复杂的 JavaScript 表达式。目前可以使用的有 + - * % ?: ! == === > < [] .,剩下的还待完善。 (3)不支持过滤器 编译到 App 和小程序平台时不支持使用过滤器,可以使用计算属性(computed)提前计算出数据(如果是数组类型,就提前计算整个数组),用以代替过滤器。 备注 : 自HBuilderX 1.7.1起,在微信小程序平台支持使用过滤器。 data 必须声明为返回一个初始数据对象的函数;否则页面关闭时,数据不会自动销毁,再次打开该页面时,会显示上次数据。 注意 :在微信小程序端,uni-app 将数据绑定功能委托给Vue,开发者需按Vue 2.0的写法实现数据绑定,不支持微信小程序的数据绑定写法,故如下写法不支持: 需修改为: 支持 Vue官方文档:计算属性 。 实现全局变量的方式需要遵循 Vue 单文件模式的开发规范。详细参考: uni-app全局变量的几种实现方式 。 非H5端不支持在 template 内使用 methods 中的函数。 备注 : 自HBuilderX 1.7.1起,在微信小程序平台支持支持在 template 内使用 methods 中的函数。 为节约性能,我们将 Class 与 Style 的表达式通过 compiler 硬编码到 uni-app 中。 全支持 Vue官方文档:条件渲染 。 全支持vue列表渲染 Vue官方文档:列表渲染 。只是需要注意一点,嵌套列表渲染,必须指定不同的索引!需要填写 :key="xx" 。 注意 :同级多个 v-for 时 key 的值是不允许重复的,key 的绑定是不支持表达式的,需要按照以下方式处理。 几乎全支持 Vue官方文档:事件处理器 。事件映射表如下所示: 注意 : (1)事件映射表中没有的原生事件也可以使用,例如map组件的regionchange 事件直接在组件上写成 @regionchange,同时这个事件也非常特殊,它的 event type 有 begin 和 end 两个,导致我们无法在handleProxy 中区分到底是什么事件,所以你在监听此类事件的时候同时监听事件名和事件类型既 <map @regionchange="functionName" @end="functionName" @begin="functionName"><map>。 (2)为兼容各端,事件需使用 v-on 或 @ 的方式绑定,请勿使用小程序端的bind 和 catch 进行事件绑定。 (3)事件修饰符 (4)若需要禁止蒙版下的页面滚动,可使用 @touchmove.stop.prevent="moveHandle",moveHandle 可以用来处理 touchmove 的事件,也可以是一个空函数。 (5)按键修饰符:uni-app运行在手机端,没有键盘事件,所以不支持按键修饰符。 支持 Vue官方文档:表单控件绑定 。建议开发过程中直接使用 uni-app:表单组件 。用法示例: (1)H5 的select 标签用 picker 组件进行代替 (2)表单元素 radio 用 radio-group 组件进行代替 组件是整个 Vue.js 中最复杂的部分,支持 Vue官方文档:组件 。有且只能使用单文件组件(.vue 组件)的形式进行支持。其他的诸如:动态组件,自定义 render ,和 <script type="text/x-template"> 字符串模版等非H5端都不支持。详细的非H5端不支持列表: (1)暂不支持在组件引用时,在组件上定义 click 等原生事件、v-show(可用 v-if 代替)和 class style 等样式属性(例:<card class="class-name"> </card> 样式是不会生效的)。 Slot(scoped 暂时还没做支持) (2)动态组件 (3)异步组件 (4)inline-template (5)X-Templates (6)keep-alive (7)transition (8)class (9)style (10)组件里使用 slot 嵌套的其他组件时不支持 v-for uni-app提供了丰富的 UI组件 ,比如: picker , map 等,需要注意的是原生组件上的事件绑定,需要以 vue 的事件绑定语法来绑定,如 bindchange="eventName" 事件,需要写成 @change="eventName" 。如: uni-app 支持配置全局组件,需在 main.js 里进行全局注册,注册后就可在所有页面里使用该组件。 注意 :Vue.component 的第一个参数必须是静态的字符串。示例: (1)main.js 里进行全局注册 (2)index.vue 里可直接使用组件 在 uni-app 中以下这些作为保留关键字,不可作为组件名。 备注 :除以上列表中的名称外,标准的 HTML 及 SVG 标签名也不能作为组件名。 (1) 如何获取上个页面传递的数据 在 onLoad 里得到,onLoad 的参数是其他页面打开当前页面所传递的数据。 (2) 如何设置全局的数据和全局的方法 uni-app内置了 vuex ,在app里的使用,可参考 hello-uniapp 的 store/index.js 。 (3)如何捕获 app 的 onError 由于 onError 并不是完整意义的生命周期,所以只提供一个捕获错误的方法,在 app 的根组件上添加名为 onError 的回调函数即可。如下: (4)组件属性设置不生效解决办法 当重复设置某些属性为相同的值时,不会同步到view层。 例如:每次将scroll-view组件的scroll-top属性值设置为0,只有第一次能顺利返回顶部。 这和props的单向数据流特性有关,组件内部scroll-top的实际值改动后,其绑定的属性并不会一同变化。解决办法有两种(以scroll-view组件为例): 备注 :第二种解决方式在某些组件可能造成抖动,推荐第一种解决方式。2023-06-06 05:37:311
vue页面缓存,keep-alive第一次无效的解决方法
方法二:使用 include + beforeRouteLeave + vuex 与方法一相似,不同的地方在于,将需要缓存的组件保存到全局变量,可以在路由的钩子函数里灵活的控制哪些组件需要缓存,那些不需要缓存;跟方法一相比,不需要每次再重新初始化数据,但是需要在vuex中保存数据; 1、在创建router实例的时候加上scrollBehavior方法 2、将需要缓存的组件加在include属性里 3、在store里加入需要缓存的的组件的变量名,和相应的方法; 4、在beforeRouteLeave钩子函数里控制需要缓存的组件2023-06-06 05:37:381
vuecli3打包部署 非根目录下 配置vue.config.js publicPath
从 Vue CLI 3.3 起已弃用baseUrl,请使用publicPath。 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上,例如 https://www.my-app.com/ 。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.my-app.com/my-app/ ,则设置 publicPath 为 /my-app/。 这个值在开发环境下同样生效。如果你想把开发服务器架设在根路径,你可以使用一个条件式的值: 在vue.config.js文件中添加如下:2023-06-06 05:37:441
vue中for循环刷新后数据叠加没效果
vuex存储的数据只是在页面中,相当于全局变量,页面刷新的时候vuex里的数据会重新初始化,导致数据丢失。因为vuex里的数据是保存在运行内存中的,当页面刷新时,页面会重新加载vue实例,vuex里面的数据就会被重新赋值办法一:将vuex中的数据直接保存到浏览器缓存中(sessionStorage、localStorage、cookie)办法二:在页面刷新的时候再次请求远程数据,使之动态更新vuex数据办法三:在父页面向后台请求远程数据,并且在页面刷新前将vuex的数据先保存至sessionStorage(以防请求数据量过大页面加载时拿不到返回的数据)2023-06-06 05:37:512
vue项目 动态路由怎么做
vue项目实现 动态路由 的方式大体可分为两种: 前端这边把路由写好,登录的时候根据用户的角色权限来动态展示路由,(前端控制路由) 详情可参阅 花裤衩大佬 的项目 手把手... 后台传来当前用户对应权限的路由表,前端通过调接口拿到后处理(后端处理路由) 这两种方法各有优点,效果都能实现,我们公司是通过第二中种方法实现的,原因就是公司项目里有一个专门的用户中心,里边逻辑很复杂,不好返给前端用户权限,担心路由放到前端不安全(以上的话是公司的后台同学讲的),那好吧,抱着都试试、锻炼下自己能力的态度,我们搞了第二种方法。 大体步骤:拦截路由->后台取到路由->保存路由到localStorage(用户登录进来只会从后台取一次,其余都从本地取,所以用户,只有退出在登录路由才会更新) 菜单名字menName; 菜单路径menPath; 菜单指向的资源menuUrl(也就是组件地址, 一般从views层级开始写) 前端登录后通过接口请求拿到菜单数据后, menName ---> name menPath ---> path menuUrl ---->components文件 转换时,用到这个方法找组件资源 把 menuUrl 可以变为components的格式,转为组件文件 生成路由表 可以再过滤一遍生成的路由表 下面这个方法找到views底下所有的组件资源 路由表里路由的组件在所有组件资源里没找到时,将该路由的path变为/404 getRouter.push({ path: "*", redirect: "/404", hidden: true }); router.addRoutes(getRouter); //动态添加路由 前置工作:配置项目路由文件,该文件中没有路由,或者存在一部分公共路由,即没有权限的路由 每个路由都使用到组件Layout,这个组件是整体的页面布局:左侧菜单列,右侧页面,所以children下边的第一级路由就是你自己的开发的页面,meta里包含着路由的名字,以及路由对应的icon; 因为可能会有多级菜单,所以会出现children下边嵌套children的情况; 路由是数组格式 实际前端需要的 component是 component: () => import("@/views/content/classify"), 因为有多级路由的出现,所以要写成遍历递归方法,确保把每个component转成组件对象 因为后台传回的是字符串,所以要把加载组件的过程 封装成一个方法,用这个方法在遍历中使用;详情查看项目里的router文件夹下的 _import_development.js和_import_production.js文件 Layout我放的目录跟其他文件的目录不一样,所以我在遍历里单独处理,各位小伙伴可自己调整哈 beforeEach路由拦截,进入判断,如果发现本地没有路由数据,那就利用axios后台取一次,取完以后,利用localStorage存储起来,利用addRoutes动态添加路由, ps:beforeEach好坏啊,一步小心就进入到了他的死循环,浏览器都tm崩了,得在一开始就加判断,拿到路由了,就直接next(),嘤嘤嘤 global.antRouter是为了传递数据给左侧菜单组件进行渲染 上边第三步会给 global.antRouter赋值,这是一个全局变量(可以用vuex替代),菜单那边拿到路由,进行渲染2023-06-06 05:37:571
qiankun怎么添加仅子应用可见的全局变量
1.安装qiankunqiankun的官网 qiankun - qiankun 安装过程$ yarn add qiankun # or npm i qiankun -S主应用安装,子应用不需要安装;2.主应用 qiankun 配置内容;vue - template - admin 作为本次记录的主体;新建 micro.js在一下代码段中,将按照qiankun的配置模式,为主应用配置加载的主应用内容;/** * qiankun 模式 * 子系统构建主控文件 * date:2021-11-26 * author:yangming * description:子系统挂在,并通过主控文件,将子系统挂在进入主系统*/import axios from "axios"import { registerMicroApps, start, initGlobalState } from "qiankun"import store from "@/store/index" // #region 加载外部配置文件/** * 用于配置,项目读取的自定义配置内容 * @returns 自定义配置内容读取 */async function getConfig() { var config = {} const localPath = process.env.NODE_ENV === "development" ? "" : "" if (process.env.NODE_ENV === "development") { // config = require(`../../../${localPath}server.config.json`) config = await axios.get(`../../../server.config.json`) } else { config = await axios.get(`../../${localPath}/server.config.json`) } // console.log(config) return config}// #endregion // #region 全局监控配置 var actions = null function GlobalState(status) { if (!actions) { actions = initGlobalState(status) actions.onGlobalStateChange( (value, prev) => { // console.log(`[主应用接收到值变化 - ${actions}]:`, value, prev) } ) } else { actions.setGlobalState(status) }}// #endregion /** * 用户登录后,装载子系统 * @param {*} token */async function LoadingMicro() { // console.log("开始加载子系统") await getConfig().then(res => { var apps = res.data.MICRO_APPS if (apps == undefined && apps.length < 1) { return } /** * @description: 乾坤注册子应用 * @param1 子应用配置 * @param2 打开子应用时候触发的生命周期 */ registerMicroApps(apps, { beforeLoad: [ function (app) { // console.log("[主应用] before load %c%s", "color: green;", apps.length) } ], beforeMount: [ function (app) { var initState = { userId: store.getters.userId, token: store.getters.token, route: store.getters.routeList.filter(x => x.meta.code == app.name), code: app.name, role: [] } // 信息变更:全局通知 GlobalState(initState) // console.log("[主应用] before mount %c%s", "color: red;", app.name) } ], afterMount: [ function (app) { // console.log("[主应用] afterMount mount %c%s", "color: green;", app.name) } ], afterUnmount: [ function (app) { // console.log("[主应用] after unmount %c%s", "color: green;", app.name) } ] }) start() })} export default LoadingMicro并在Layout Index.vue中的create 时 LoadingMicro这个方法,用于在客户端启动页面时,装载子应用;server.config.json是外部配置文件,用于在系统部署后,可通过修改Json的内容,重新配置主应用的加载内容,可根据自己实际情况进行配置注册;{ "BASE_URL":"http://localhost:20011/api/v1", "MICRO_APPS":[ { "name": "EMS", "entry": "//localhost:20009", "container": "#ChildSystem", "activeRule": "#/ems-micro", "props": { "code": "EMS", "name": "EMS - Test" } } ]}完成以上步骤之后,基本上已经完成了主应用的qiankun配置;注意:由于子应用启动的时候,需要和主应用保持相对信息一致(token、时间戳),所以,在主应用的qiankun启动时,需要对全局状态进行广播,就需要在beforeMount时,更新全局通知的一致性信息,包括了token、userid等内容;(尤其,在主应用退出登录后,重新登录时,同步token,userid,未避免token不一致,导致的子应用死循环,验证token);3.子应用配置在主应用配置完成后,就要对子应用进行配置,配置过程中,可在子应用的main.js中直接配置,也可以自己建立一个js文件用于管理子应用配置内容;/** * 新增: * 渲染函数 * 两种情况:主应用生命周期钩子中运行 / 微应用单独启动时运行 */function render(props) { // console.log("子应用render的参数", props) props.onGlobalStateChange((state, prevState) => { // console.log("通信状态发生改变:", state, prevState) store.dispatch("authorization/microRegisterActive", state) }, true) // 挂载应用 instance = new Vue({ router, store, render: (h) => h(App) }).$mount("#micro-app")} // new Vue({// el: "#app",// router,// store,// render: h => h(App)// }) // 新增:用于保存vue实例let instance = null // console.log(window.__POWERED_BY_QIANKUN__)// 新增:动态设置 webpack publicPath,防止资源加载出错if (window.__POWERED_BY_QIANKUN__) { // eslint-disable-next-line no-undef __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__} /** * 新增: * bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。 * 通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。 */export async function bootstrap(props) { // console.log(props) // console.log("初始化调用")} /** * 新增: * 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法 */export async function mount(props) { // console.log("触发时调用", props) render(props)} /** * 新增: * 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例 */export async function unmount() { store.dispatch("authorization/microUnApp") // console.log("切出或卸载调用") instance.$destroy() instance = null} // 新增:独立运行时,直接挂载应用if (!window.__POWERED_BY_QIANKUN__) { render()}我是在main.js中直接进行了配置,因为内容不是很多,而且一旦配置ok,基本上不会出现变更;请注意在render方法中的 store的 authorization/microRegisterActive 方法该方法的目的,就是为了接收到全局状态通知的时候,用于新的数据注册控制; /** * 注册路由 * @param {*} param0 * @param {*} data */ microRegisterActive({ commit }, data) { commit("setInfo", data) // 全局变量中如果已经存在router 则不需要再次装载,避免冲突:黄色警告 if (state.route.length === 0) { var newRouter = microRegisterRouter(data.route, data.code.toLowerCase() + "-micro") router.addRoutes(newRouter) commit("setRoute", newRouter) } }这个方法的目的就是为了在子应用的全局变量中注册,主应用的全局通知,并注册从主应用获取的子应用对应的路由信息,并注册进入子应用的router中;完成这个配置以后,子应用中的全局变量中,就已经有了token、userid、routerArray数据了,那么子应用的相关全局信息已经健全,类似完成了登录工作;但是,在子应用运行过程中,还需要根据业务的实际情况,对用户的活动状态进行校验时,就需要判定当前用户是否为活动用户;如果不需要如此业务进行支撑,就需要保证子应用在脱离主应用的情况下,无法独立运行;因为我们的request的请求过程中,必须要带入token这个头参数,这样才能保证子应用的微服务可以通过与主应用的微服务进行校验通讯,否则访问非法;同样的,在主应用的全局通讯过程中,还可以将子应用的code传递过来,便于日志记录过程中,区别日志来源是那个子系统。如果,在使用子应用的横向扩展时,也可以根据code进行编号处理,便于区分相关操作的渠道;(这个就不展示了,需要自己实现);4.部署在完成以上配置后,主应用和子应用的启动过程和开发过程基本上,就已经满足开发使用了。然而,在部署过程中,可能就会遇到一些红色问题;例如:css、js文件找不到。这个问题,就需要在子应用的vue.config.js中进行配置,主要配置内容就是publicPath的路径变更publicPath: process.env.NODE_ENV === "development" ? "/" : "/microApps/ems-micro"这个配置路径的解释:判断当前是否为开发模式,如果是开发模式,那么publichPath的路径就是‘/" ,而当前模式不是开发模式时,就需要将publicPath更改为"/microApps/ems-micro"如此才能让部署过程中,子应用的路径正确;microApps/ems-micro 是物理路径,也就是在主应用的 dlist 中 创建microApps文件夹,并在 microApps文件夹中创建ems-micro文件夹,用于存放,ems-micro工程的dlist文件;注意:publicPath的部署路径,必须和文件创建的路劲一致,否则就会报错;5.前端同一端口部署说明1.文件夹结构说明在部署过程中,需要将主应用与子应用使用一个端口的配置如下: 在开发过程中 Entry 可以为localhst:00001这种模式,如果要发布,则要将子应用的路径改为绝对路径。且前后必须,加入 / , 例如:/mes-micro/"MICRO_APPS":[ { "name": "MES", "entry": "/mes-micro/", // 与主应用的文件管理器中的路径一致 "container": "#ChildSystem", "activeRule": "#/mes-micro", "props": { "title":"生产管理系统", "code": "MES", "name": "MES - System", "userId": null, "token":null, "route": null } } ]所谓路径一致,就是要在如下模式:红色框选中,就是子应用的vue发布代码;2.子应用配置,需要在vue.config.js中配置publicPathpublicPath: process.env.NODE_ENV === "development" ? "/" : "/mes-micro/",2023-06-06 05:38:041
vue-cli3 静态资源配置
静态资源可以通过两种方式进行处理: 在 JavaScript 被导入或在 template/CSS 中通过相对路径被引用。这类引用会被 webpack 处理。 放置在 public 目录下或通过绝对路径被引用。这类资源将会直接被拷贝,而不会经过 webpack 的处理。 使用相对路径引入的静态资源文件,会被webpack处理解析为模块依赖。例如,在 <img src="./logo.png"> 和 background: url(./logo.png) ,以及CSS @import "./logo.png" 是相对的资源路径。在vue2.x版本类似assets文件夹。 2.public文件夹 public文件夹下的文件并不会被Webpack处理:它们会直接被复制到最终的打包目录(文件名需指定)下。必须使用绝对路径引用这些文件,简单说就是用来存放万年不变的文件。 在vue2.x版本类似static/ 文件夹。 /public/logo.png 参考: https://www.cnblogs.com/wzcsqaws/p/11283228.html public/index.html 文件是一个会被 html-webpack-plugin 处理的模板。构建中,各种资源路径会被注入解析。可以使用 lodash template 语法插入内容。 除了 被 html-webpack-plugin 暴露的默认值 之外,所有 客户端环境变量 也可以直接使用。例如, BASE_URL 的用法:2023-06-06 05:38:111
vue3.0+vite+router搭建项目
(1)、去 Node.js 官网 安装node (2)、配置git bash (3)安装yarn(yarn比npm更加好用) (4)、安装yarn淘宝源和npm淘宝源 yarn设置镜像: npm设置为淘宝镜像 (1)、安装全局vite 可以改成这个创建(2)、创建项目(项目名:mangoUI) 创建成功之后有三个指令 cd mangoUI 和 yarn install , yarn dev 依次执行,项目创建成功。 注意:使用vscode打开最好安装一个插件:Vue 3 snippets,方便模板建立。 (1)、查看所有路由版本: (2)、安装路由(vue-router>=4.0.0) (3)、初始化路由 情景一:打开main.js,初始化路由。 情景二:(使用ts语法)将main.js改成main.ts,初始化路由。别忘了index.html引用main.js路径后续要改成main.ts。 这时组件引用路径会报一个错误,这是因为Typescript只能理解.ts文件,不能理解.vue文件。 解决报错方法:在根目录新建目录shims-vue.d.ts,告诉TS如何理解.vue文件 如果关闭shims-vue.d.ts还是报错,再在根目录创建一个 tsconfig.json 文件2023-06-06 05:38:281
vue3.0和2.0的区别
项目目录不同1、vue-cli3.o移除了config.文件夹。2、多了vue.config.js文件。3、新增了一个views文件夹。4、删除了static新增了public文件夹。5、index.html移动到public了。配置项不同1、vue-cli2.0的域名配置,分为开发环境和生产环境。2、所以配置域名时,需要在config中的dev.env.js和。3、prod.env.js中分别配置3.0 config.文件已经被移除。4、但是多了。env.production和env.development文件。5、除了文件位置,实际配置起来和2.没什么不同。创建项目的方式不一样1、vue-cli2.0,vue init webpack项目名。2、vue-cli3.0 vue create项目名。2023-06-06 05:38:351
VUE异步函数return问题解决方案
异步函数return问题: 在写VUE前端代码时,会遇到将 带有return结果的异步请求函数 (如请求后台数据)设置为公共函数,在其他地方调用的场景。但是因为是异步请求数据,实际需要return的值在调用返回时,还未生成,所以导致return的内容为undefined。(见参考[1]的分析) 例如:公共函数和调用方式 调用返回时,因为异步请求还未结束,真正的结果还没有获取到,所以以上代码调用位置result得到的返回值为“undefined”。 解决方案: 2. 通过回调函数实现异步return调用 如果在回调函数里面将return返回值赋值给全局变量this.xxx,不能直接this.xxx = ret,需要将this作为变量来引用(参考[2]说明),方法如下: 参考: [1] vue中函数为什么不能在异步操作里return出数据_PC_136的博客-CSDN博客_vue异步return [2] JS中this的指向问题(Uncaught (in promise) TypeError: Cannot read property ‘$router‘ of undefined)_whitek387的博客-CSDN博客2023-06-06 05:38:481
vue定时器重新计数
vue写全局定时方法是直接上代码,全局变量存在seesion storage中,纯原生js,可在任意场景/框架中使用。 方法过程是初始化计时器,建立计时器模板,使用字符串设置时分秒,安排窗口聚焦和失焦,就能够成功的设置好全局的定时方法。 如何使用数据:因为是存在sessionStorage中的,所以直接用sessionStorage.getItem(str)就能拿到对应数据,且数据刷新后不清除,注意拿到的是字符串,且方法已经补0。 一些问题:如果要刷新后计时器方法还能用,在app.vue(全局)中写一个window.onload,虽然把以上方法写里面就行了,其他框架没用过,但是原理也差不多。2023-06-06 05:38:551