vue 自定义指令控制元素的显示隐藏,切换路由,刷新页面,添加指令的元素全部消失了? 怎么改呢? 使用方式 Vue.directive("bt-permission", { inserted: (el: any, binding: any, vnode: any) => { let btnPermissionList = vnode.context?.$store?.getters["userStore/getBtnAccess"]; if (btnPermissionList && typeof btnPermissionList === "string") { btnPermissionList = JSON.parse(btnPermissionList); } const [path, code] = binding.value; // 解构赋值获取参数 const formatPath = getLastPartAfterSlash(path); const hasPermission = btnPermissionList[formatPath]; let btnVisibility = true; if (hasPermission) { btnVisibility = hasPermission.some((item: any) => { return item.indexOf(code) !== -1; }); } else { btnVisibility = false; } if (!btnVisibility) { el.style.display = "none"; } }, });
Vue2.6.14 源码 core/vdom/patch.js 文件里 patchVnode 方法中,五种新旧节点比较的情况,其中一种旧节点有 text ,无新节点的情况,我无法模拟出具体的应用场景,请教下各位。 // 省去了部分代码 function patchVnode(oldVnode, vnode) { if (isUndef(vnode.text)) { if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, '') } } } 比如这个例子, {{name}} name 从有值到为空的情况,这匹配到的是 if (oldVnode.text !== vnode.text) { nodeOps.setTextContent(elm, vnode.text) }
"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20250111/63174019205f2093b0c11ceb130cdffe.png) export default { name:'Test', data(){ return{ tableData: [{ date: '2016-05-02', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄上海市普陀区金沙江路 1518 弄上海市普陀区金沙江路 1518 弄上海市普陀区金沙江路 1518 弄' }, { date: '2016-05-04', name: '王小虎', address: '上海市普陀区金沙江路 1517 弄' }] } }, methods: { }, } .is-tooltipStyle { background: #fff; color: #3759af; border: 1px solid rgb(158, 157, 157); font-size: 15px; }
import Tree from '@/components/tree/index.vue' import {GetOrganiztionalData,GetUserList} from '@/api/detailedList' export default { components: {Tree}, data() { return { data: [] } }, props: { treeUserInfo: Object }, created() { this.getOrganizational() }, methods: { // 辅助函数:根据部门ID找到对应的部门节点 findDepartmentNode(departmentId, nodes) { for (const node of nodes) { if (node.id === departmentId) { return node; } // 如果该节点有子节点,递归查找 if (node.children && node.children.length > 0) { const foundNode = this.findDepartmentNode(departmentId, node.children); if (foundNode) { return foundNode; } } } return null; // 如果找不到对应的部门节点 }, getOrganizational() { GetOrganiztionalData({}).then(res => { if(this.treeUserInfo.erpCode) { console.log('2222') this.data = [res.data] const id = this.treeUserInfo.erpDepCode this.getUserInfo(id) } else { this.data = [res.data] } }) }, getUserInfo(id) { const departmentNode = this.findDepartmentNode(id, this.data) if(!departmentNode.children) { this.$set(departmentNode, 'children', []) } const obj = { erpParentCode: id } let array = [] GetUserList(obj).then(res => { res.data.map(item => { array.push({ text:item.erpName, erpCode: item.erpCode }) }) departmentNode.children.push(...array) }) } }, } 这是我写的代码,走console.log('222')的时候,传递给子组件的 data数据没有,应该怎么解决 子组件代码 export default { data() { return { defaultCheckKeys: [] } }, props: { data: Array, keys:String }, methods: { handleExpandClick(node,data) { node.expanded = !node.expanded; } }
vue2中,vue-cli进行element-ui打包不放入check-vendor.js,而是单文件组件形式存在,比如el-input-683fb76c.js这种的,完全从check-vendor中抽离出来,而且是懒加载的形式。 也就是说: 如果home.vue组件使用了el-input组件,才会加载这个组件,而按照现在的打包方式,check-vendor会在页面一开始渲染就加载,包也很大,首页优化难做。 所以能不能通过vue-cli的webpack配置完成这个打包,求解 现在对一些组件使用注解魔法: let dNumber = ()=> import(/* webpackChunkName: "d-Number" */ '@/components/public/d-number'); 打包出来的文件名就是d-Number.js,但是不知道怎么抽离element-ui的每一个按需导入的组件,也形成懒加载的形式,或者check-vendor.js其实可以不存在,所有的资源都是懒加载形式
vue2项目前端,token的存放以及设置过期时间? 是选择存放在cookie中设置过期时间,还是存放在localStorage中设置过期时间,哪一个更符合需求,ps:前端初入行,没使用过cookie,不太了解,平时只用localStorage
前端埋点统计页面停留时长 最近在做埋点需求,需要统计页面的浏览时长,项目是使用的vue2+elementUI,普通的页面级浏览时长可以用路由守卫进行统计,但有些需求需要统计页面内tabs下的浏览时长,甚至是存在多层tabs的情况,想要写一个通用的方法,请求大家给予帮助,提供一些思路。 求求了,救救孩子吧。
前端如何把图片上传到服务端? 使用技术:vue2 + elementUI 背景: 前端和后端分别部署到不同的服务器上,前端页面是个表单, 表单里面有上传图片的功能,上传的图片然后在其他页面展示的业务逻辑。后台提供的表单接口要求我只把图片名字(xxxx.png/xxx.jpg)传给他。 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241008/ff360fcf3c2065e39e94c313327bfb71.png) 问题: 我把生产包放到nginx里的html文件夹后测试。发现没法上传。nginx的配置也做过修改了 vue: data() { return { imageUrl: '', action: window.NODE_ENV === 'development' ? '' : window.location.origin + '/common/image/' } }, methods: { handleChange(file) { console.log('file', file); this.imageUrl = URL.createObjectURL(file.raw) } handleAvatarSuccess(res, file) { // console.log('res',res) // console.log(file) }, beforeAvatarUpload(file) { }, } nginx配置 server { listen 8085; server_name 10.19.129.12:19090; # 127.0.0.1 #10.19.129.12:19090 charset utf-8; access_log on; add_header Access-Control-Allow-Origin '*'; add_header Access-Control-Allow-Methods 'POST,PUT,GET,DELETE'; add_header Access-Control-Allow-Headers 'version, access-token, user-token, Accept, apiAuth, User-Agent, Keep-Alive, Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With'; # 前端vue转发 或者是/dist/ location /dist/ { root html; rewrite /(.*)$ /$1 break; index login.html index.html index.htm; #启动文件 } location /common/image/ { root D:/codes/nginx-1.18.0/; index index.html index.htm; } } 结果: 生产环境下上传图片报错了:"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241008/7d283f08814c084ffce2d324c6d625dd.png)"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241008/62d13f4ee2f849d6834d56c981442148.png) 目录: "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241008/a1db502b72dd1daeb17bcac8053790c4.png)"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241008/d18d756e82d7cf3e86499aef941e302c.png)"image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241008/5266acd315c481091ea9b22e24cb467d.png) 尝试1:传给后台的图片名字是base64,展示的时候后台再返回base64,但是加载太慢没有通过验收 尝试2:我手动把图片复制到'/common/image/'文件夹下,展示的时候是可以展示的。 img可以展示: data() { return { // coverPhotoName是后台返回的图片名字 imgSrc: window.location.origin + '/common/image/' + coverPhotoName } } 请问我应该怎么修改代码才能做到把图片上传到'/common/image/'文件夹下?如果我提供的信息太少可以积极指正,谢谢各位大佬🥰
vue2使用a标签跳转到外部链接,ios手机返回两次才回退到上一页面,怎么解决 安卓只返回一次
写了个loader想对vue单文件的template预先做些处理,不过运行起来会有报错 vue.config.js const { defineConfig } = require('@vue/cli-service') const path = require('path') // const { VueLoaderPlugin } = require('vue-loader') module.exports = defineConfig({ transpileDependencies: true, chainWebpack: config => { config.module .rule('vue') // .test(/\.vue$/) .use('vue-loader') .loader('vue-loader') .end() .use('my-loader') .loader(path.resolve(__dirname, './my-loader.js')) // .before('vue-loader') .end() } }) my-loader.js module.exports = function (content) { const templateMatch = content.match(/([\s\S]*?)/); let restContent = content if (templateMatch) { const templateContent = templateMatch[1]; restContent = content.replace(/[\s\S]*?/, ''); let returnContent = templateContent.replace(/]*)>/g // tmp let contentArr = returnContent.split('\n') let resultArr = contentArr.map((item, index) => { if (regInput.test(item)) { item = item.replace(/