相关资料

1.解决npm run build 无法打包的问题,一直卡,注释掉

微信图片_20200401105640.png

2.点击el-cascader 的圈圈可以收起

https://blog.csdn.net/qq_36410795/article/details/100894520 评论第四条

  1. <el-cascader
  2. 省略。。。。。。
  3. ref="elcascader"
  4. @visible-change="elCascaderOnlick"
  5. @expand-change="elCascaderOnlick"
  6. ></el-cascader>

然后通过method

  1. elCascaderOnlick() {
  2. let that = this;
  3. setTimeout(function() {
  4. document.querySelectorAll(".el-cascader-node__label").forEach(el => {
  5. el.onclick = function() {
  6. this.previousElementSibling.click();
  7. that.$refs.elcascader.dropDownVisible = false;
  8. };
  9. });
  10. document
  11. .querySelectorAll(".el-cascader-panel .el-radio")
  12. .forEach(el => {
  13. el.onclick = function() {
  14. that.$refs.elcascader.dropDownVisible = false;
  15. };
  16. });
  17. }, 100);
  18. },

3.通过id号寻找他所有的父级

https://www.cnblogs.com/qingmiaokeji/p/11023690.html

  1. this.form.parentIdArr = this.familyTree(this.treeData,row.parentId);
  1. familyTree(menuTree,id){
  2. let temp = [];
  3. let forFn = function (arr, id) {
  4. for (let i = 0; i < arr.length; i++) {
  5. let item = arr[i];
  6. if (item.value === id) {
  7. temp.unshift(item.value)
  8. forFn(menuTree, item.parentId)
  9. break
  10. } else {
  11. if (item.children) {
  12. forFn(item.children, id)
  13. }
  14. }
  15. }
  16. }
  17. forFn(menuTree, id)
  18. return temp
  19. },

4.Vue项目中实现用户登录及token验证

https://blog.csdn.net/sleepwalker_1992/article/details/82974703
备注:请求头加token 是在main.js文件中添加

5.树形结构,通过id值查找该元素

https://blog.csdn.net/weixin_34143774/article/details/91419478

  1. var data = [
  2. {
  3. id: 1, name: "办公管理", pid: 0,
  4. children: [
  5. {
  6. id: 2, name: "请假申请", pid: 1,
  7. children: [
  8. {id: 4, name: "请假记录", pid: 2}
  9. ],
  10. },
  11. {id: 3, name: "出差申请", pid: 1}
  12. ]
  13. },
  14. {
  15. id: 5, name: "系统设置", pid: 0,
  16. children: [
  17. {
  18. id: 6, name: "权限管理", pid: 5,
  19. children: [
  20. {id: 7, name: "用户角色", pid: 6},
  21. {id: 8, name: "菜单设置", pid: 6}
  22. ]
  23. }
  24. ]
  25. },
  26. ];
  27. function getChidlren(id) {
  28. var hasFound = false, // 表示是否有找到id值
  29. result = null;
  30. var fn = function (data) {
  31. if (Array.isArray(data) && !hasFound) { // 判断是否是数组并且没有的情况下,
  32. data.forEach(item => {
  33. if (item.id === id) { // 数据循环每个子项,并且判断子项下边是否有id值
  34. result = item; // 返回的结果等于每一项
  35. hasFound = true; // 并且找到id值
  36. } else if (item.children) {
  37. fn(item.children); // 递归调用下边的子项
  38. }
  39. })
  40. }
  41. }
  42. fn(data); // 调用一下
  43. return result;
  44. }
  45. console.log(getChidlren(3));复制代码

6.vue项目上安装SCSS

https://blog.csdn.net/qq_27449993/article/details/95048760

7.vue 中使用axios.all 请求多个api

https://www.imooc.com/wenda/detail/494702

  1. export const treeTable = (params1, params2, params3) => {
  2. return axios.all([
  3. axios.post(`${base}/organization/selectAllOrganization.action`, params1),
  4. axios.post(`${base}/station/selectAllStation.action`, params2),
  5. axios.post(`${base}/deviceInfo/selectAllDeviceInfo.action`, params3)
  6. ]).then(res => res);
  7. }

8.tooltip 分割符和换行

  1. <el-table-column label="操作权限" width="480" align="center">
  2. <template slot-scope="scope">
  3. <el-tooltip placement="top" v-for="(item,index) in scope.row.sOperations" :key="index">
  4. <span slot="content" v-for="(item,index) in scope.row.sOperations"
  5. :key="index">{{item.pperationName}} | </span>
  6. <el-tag style="margin: 0 6px 6px 0">{{item.pperationName}}</el-tag>
  7. </el-tooltip>
  8. </template>
  9. </el-table-column>
  10. <style>
  11. .el-tooltip__popper {
  12. max-width: 350px;
  13. }
  14. </style>

微信截图_20200407110429.png

9.第一次表单验证的结果,在第二次表单验证时仍然存在

https://blog.csdn.net/weixin_37930716/article/details/90234705

  1. handleEdit(platform) {//添加、编辑弹出
  2. //初始值并移除校验结果
  3. if (this.$refs.form){
  4. this.$refs.form.resetFields();
  5. }
  6. ......
  7. }

10.如何隐藏浏览器控制台输出async-validator验证警告

https://segmentfault.com/q/1010000017007638
微信截图_20200408145638.png

11.el-cascader回显定位问题 :key=”isResouceShow”

  1. <el-cascader
  2. class="half"
  3. clearable
  4. change-on-select
  5. v-model="form.administration"
  6. :options="form.administrationList"
  7. placeholder="行政信息" :key="isResouceShow">
  8. </el-cascader>
  1. isResouceShow:0, //行政信息的key
  1. handleEdit(platform){//添加、编辑弹出
  2. if(platform){//编辑
  3. this.operation = 'edit';
  4. ++this.isResouceShow;

12.vue打包时给静态资源增加版本号

https://www.cnblogs.com/miaSlady/p/10150064.html
但是vue-cli3 脚手架建的项目是没有build的,所以新建版本号需要修改一下文件
(1)在根目录新建.env 这个文件配置全局环境变量,自定义版本号

  1. VUE_APP_Version = 'v1.0'

(2)vue.config.js文件中添加

  1. configureWebpack: { // webpack 配置
  2. output: {
  3. // 输出重构 打包编译后的 文件名称 【模块名称.版本号】
  4. filename: `static/js/[name].${process.env.VUE_APP_Version}.${Timestamp}.js`,
  5. chunkFilename: `static/js/[name].${process.env.VUE_APP_Version}.${Timestamp}.js`
  6. },
  7. },

13.element-UI 根据table中数据改变颜色 或显示对应内容

https://blog.csdn.net/qq_41999617/article/details/84847991

14.自定义指令+后端 实现动态全局按钮权限控制(v-has)

https://blog.csdn.net/j123450/article/details/102515153
备注:第三部省略,第四步可以直接在登录的时候获取按钮数据

15.利用npm 安装删除模块

https://blog.csdn.net/yihanzhi/article/details/75665959
例如:npm unistall vue-i18n

16.如何安装使用vue-in8n

(1)安装

  1. npm install vue-i18n --save

(2)main.js

  1. import VueI18n from 'vue-i18n'
  2. Vue.use(VueI18n);
  3. /*---------基本使用-----------*/
  4. const i18n = new VueI18n({
  5. locale: 'zh',
  6. messages
  7. });

17.前端如何解决 index.html 浏览器缓存

参考:https://blog.csdn.net/AwayFuture/article/details/105929842?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-3
打包:hash和时间戳照常加
以下解决的是:index.html文件中请求的js和css都是最新的,但是因为浏览器缓存,他读取的不是最新的文件,
把根目录中的index.html 手动加上以下代码

  1. <meta http-equiv="pragma" content="no-cache">
  2. <meta http-equiv="Cache-Control" content="no-cache, must-revalidate">
  3. <meta http-equiv="expires" content="Mon, 23 Jan 1978 20:52:30 GMT">

image.png
备注:如果后端是使用nginx反向代理,可以让后端修改nginx.conf文件的对应server中设置,让index.html不使用强制缓存;

18.Vue中监听$store 中的数据的方法

参考:https://blog.csdn.net/MdnyzZ/article/details/87865860?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.edu_weight

  1. computed:{
  2. haha () {
  3. return this.$store.state.msg
  4. }
  5. },
  6. watch:{
  7. hahafunction () {
  8. //插入需要在仓库数据变化时做的逻辑处理
  9. }
  10. }

19.Vue中如何公共配置服务器接口地址

(1)static文件夹中新建serverConfig.js文件

  1. /*公共配置服务器接口地址*/
  2. window.g = {
  3. base_2: "http://192.168.1.21:18080",
  4. base_4: "ws://192.168.1.21:18080"
  5. };

(2)index.html中加上
image.png
(3)api.js中

  1. let base_2 = window.g.base_2;
  2. let base_4 = window.g.base_4;

20.Vue中input框禁止输入空格

使用:trim

  1. <el-input type="textarea" v-model.trim="formulaLeft" rows="4" ></el-input>

22.隔行换色,斑马纹

使用::stripe=”true”

  1. <el-table :data="tableData" :stripe="true" style="width: 100%">
  2. </el-table>
  3. <style>
  4. .el-table--striped .el-table__body tr.el-table__row--striped td {
  5. background: #5daf34;
  6. }
  7. </style>

22.指定特殊行的背景色

使用::row-class-name=”tableRowClassName”

  1. <el-table :data="tableData" style="width: 100%" :row-class-name="tableRowClassName">
  2. </el-table>
  3. 方法:
  4. tableRowClassName({row}){
  5. if(row.name === '王小虎'){
  6. return 'warning-row'
  7. }
  8. return '';
  9. }
  10. <style>
  11. .el-table .warning-row {
  12. background: #ff0000;
  13. }
  14. </style>

23.element-ui tabs切换 实现按需加载

参考:https://www.cnblogs.com/wgy0528/p/13274967.html?utm_source=tuicool
https://www.cnblogs.com/bobo1/p/11023014.html
image.png

  1. <template>
  2. <el-card class="box-card white-main" id="user">
  3. <div slot="header" class="clearfix">
  4. <span>发送记录</span>
  5. </div>
  6. <div class="item">
  7. <el-tabs v-model="activeName" type="card" @tab-click="loadTab">
  8. <el-tab-pane label="今日" name="today">
  9. <Search style="margin-bottom:10px;" excelName="邮箱-发送" v-if="load.today" />
  10. </el-tab-pane>
  11. <el-tab-pane label="昨日" name="yesterday">
  12. <Yesterday style="margin-bottom:10px;" excelName="邮箱-发送" v-if="load.yesterday"/>
  13. </el-tab-pane>
  14. <el-tab-pane label="状态" name="state">
  15. <State style="margin-bottom:10px;" v-if="load.state" />
  16. </el-tab-pane>
  17. </el-tabs>
  18. </div>
  19. </el-card>
  20. </template>
  21. <script>
  22. import Search from './components/search'
  23. import Yesterday from './components/yesterday'
  24. import State from './components/state'
  25. export default {
  26. name: "index.vue",
  27. components: {
  28. Search,
  29. Yesterday,
  30. State
  31. },
  32. data() {
  33. return {
  34. activeName: 'today',
  35. load: {
  36. today: true,
  37. yesterday: false,
  38. beforeYesterday: false,
  39. earlier: false,
  40. state: false
  41. }
  42. }
  43. },
  44. methods: {
  45. // 按需加载后端数据[tab]
  46. loadTab(tab, event) {
  47. if (this.load[tab.name] === false){
  48. this.load[tab.name] = true;
  49. console.log(this.load)
  50. }
  51. }
  52. }
  53. }
  54. </script>

23.vue中在表格中添加输入框增删改

image.png

  1. <template>
  2. <div class="block">
  3. <el-form :model="formData" ref="formData">
  4. <el-table :data="formData.tableData" border stripe style="width: 100%;">
  5. <el-table-column prop="name" label="姓名">
  6. <template slot-scope="scope">
  7. <el-form-item v-if="scope.row.edit" :prop="'tableData.' + scope.$index + '.name'" :rules='rules.name'>
  8. <el-input v-model="scope.row.name" placeholder="姓名"></el-input>
  9. </el-form-item>
  10. <span v-else>{{scope.row.name}}</span>
  11. </template>
  12. </el-table-column>
  13. <el-table-column prop="sex" label="性别">
  14. <template slot-scope="scope">
  15. <el-form-item v-if="scope.row.edit" :prop="'tableData.' + scope.$index + '.sex'" :rules='rules.sex'>
  16. <el-select v-model="scope.row.sex" placeholder="请选择">
  17. <el-option label="男" value="1"></el-option>
  18. <el-option label="女" value="2"></el-option>
  19. </el-select>
  20. </el-form-item>
  21. <span v-else>
  22. <p v-if="scope.row.sex==1"></p>
  23. <p v-if="scope.row.sex==2"></p>
  24. </span>
  25. </template>
  26. </el-table-column>
  27. <el-table-column label="操作">
  28. <template slot-scope="scope">
  29. <div v-if="scope.row.edit">
  30. <el-button type="text" size="medium" @click="confirmAdd(scope.row,'formData')">
  31. <span class="el-tag el-tag--mini" style="cursor: pointer;" aria-hidden="true">保存</span>
  32. </el-button>
  33. <el-button type="text" size="medium">
  34. <span class="el-tag el-tag--info el-tag--mini" style="cursor: pointer;" aria-hidden="true">取消</span>
  35. </el-button>
  36. </div>
  37. <div v-else>
  38. <el-button type="text" size="medium" @click="editData(scope.row)">
  39. <span class="el-tag el-tag--mini" style="cursor: pointer;" aria-hidden="true">修改</span>
  40. </el-button>
  41. <el-button type="text" size="medium" @click="deleteData(scope.row,scope.$index)">
  42. <span class="el-tag el-tag--danger el-tag--mini" style="cursor: pointer;" aria-hidden="true">删除</span>
  43. </el-button>
  44. </div>
  45. </template>
  46. </el-table-column>
  47. </el-table>
  48. </el-form>
  49. <el-button type="text" @click="addData">添加数据</el-button>
  50. <el-divider></el-divider>
  51. <el-button @click="submitData('formData')">提交 </el-button>
  52. </div>
  53. </template>
  54. <script>
  55. export default {
  56. name: "index",
  57. data() {
  58. return {
  59. formData: {
  60. tableData: [],
  61. },
  62. rules: {
  63. name: {
  64. required: true,
  65. message: '请输入名字',
  66. },
  67. sex: {
  68. required: true,
  69. message: '请选择性别',
  70. },
  71. },
  72. }
  73. },
  74. methods: {
  75. //添加
  76. addData() {
  77. this.formData.tableData.unshift({
  78. edit: true,
  79. });
  80. },
  81. //确认添加
  82. confirmAdd(row, formName) {
  83. this.$refs[formName].validate((valid) => {
  84. if (valid) {
  85. row.edit = false;
  86. }
  87. })
  88. },
  89. //修改
  90. editData(row) {
  91. row.edit = true;
  92. },
  93. //删除
  94. deleteData(row, index) {
  95. this.formData.tableData.splice(index, 1);
  96. },
  97. submitData(formName) {
  98. this.$refs[formName].validate((valid) => {
  99. if (valid) {
  100. let data = this.formData.tableData;
  101. alert(JSON.stringify(data))
  102. }
  103. })
  104. },
  105. }
  106. }
  107. </script>
  108. <style>
  109. .el-table .warning-row {
  110. background: #ff0000;
  111. }
  112. .myTable {
  113. border-collapse: collapse;
  114. margin: 0 auto;
  115. text-align: center;
  116. }
  117. .myTable td,
  118. .myTable th {
  119. border: 1px solid #cad9ea;
  120. color: #666;
  121. height: 60px;
  122. }
  123. </style>

24.模拟textarea可以粘贴图片

  1. <template>
  2. <div>
  3. <div class="img-textarea" @paste="descImgPaste($event)" contenteditable="true" ></div>
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. name: "index",
  9. data() {
  10. return {
  11. dialogVisible: false,
  12. desc: {
  13. description: '描述文字',
  14. figure:['http://pic2.sc.chinaz.com/files/pic/pic9/202004/bpic20079.jpg' ]
  15. }
  16. }
  17. },
  18. methods: {
  19. confirmAdd(data){ //data是描述信息,类似于{description: '描述文字' ,figure:[ 图片数组 ] }
  20. this.dialogVisible= true
  21. this.$nextTick(() => {
  22. let elem = document.getElementsByClassName('img-textarea')[0]
  23. let imgs = ''
  24. if(data.figure.length > 0){
  25. for(let item of data.figure){
  26. let img= `\n<img src="${item}">` //css样式中加入white-space:pre-line之后,\n换行才会生效
  27. imgs += img
  28. }
  29. }
  30. elem.innerHTML = data.description + imgs
  31. })
  32. },
  33. descImgPaste(event){
  34. if (event.clipboardData || event.originalEvent) {
  35. let clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
  36. if(clipboardData.items){
  37. let blob;
  38. for (let i = 0; i < clipboardData.items.length; i++) {
  39. console.log(clipboardData.items[i].type)
  40. if (clipboardData.items[i].type.indexOf("image") !== -1) {
  41. blob = clipboardData.items[i].getAsFile();
  42. }
  43. }
  44. let render = new FileReader();
  45. render.onload = function (evt) {
  46. //输出base64编码
  47. let base64 = evt.target.result;
  48. let imgElem = document.createElement('img');
  49. imgElem.src = base64;
  50. // document.getElementsByClassName('img-textarea')[0].appendChild(imgElem)
  51. };
  52. if(blob){
  53. render.readAsDataURL(blob);
  54. }
  55. }
  56. }
  57. },
  58. }
  59. }
  60. </script>
  61. <style scoped>
  62. .img-textarea{
  63. width: 600px;
  64. height: 300px;
  65. border:#333 1px solid;
  66. text-align: left;
  67. padding: 10px;
  68. margin: 0 auto;
  69. }
  70. </style>

25.vue支持ln(x)的算法

参考:https://www.npmjs.com/package/math-ln

  1. npm install math-ln
  2. let ln = require( 'math-ln' );
  3. console.log(ln(4))

26.vue计算ln(x)=2.302585092994046中的x值的算法

  1. js 次方 开方
  2. 次方 ,用Math.pow(值,次方数)
  3. 如:
  4. Math.pow(3,2); 3的平方
  5. Math.Pow(2,3); 2的立方
  6. 开方Math.sqrt(值)
  7. 如:
  8. Math.sqrt(9); 9 开方,返回结果3
  9. 如:e的值约等于2.718
  10. let ln = require( 'math-ln' );
  11. console.log(ln(10)); //2.302585092994046
  12. console.log(Math.pow(2.718,2.302585092994046)); //9.997612866396764

27.字母和数字和加减号混合的字符串拆分

  1. let sstr = "13HCH2O123Na123+22CO347NA12"
  2. let ss = sstr.match(/(\d+|[^\d]+)/g).join(',');
  3. console.log(ss);
  4. console.log(ss.split(","))
  5. 结果:13,HCH,2,O,123,Na,123,+,22,CO,347,NA,12
  6. ["13", "HCH", "2", "O", "123", "Na", "123", "+", "22", "CO", "347", "NA", "12"]

28.切换国内镜像

  1. npm install -g mirror-config-china --registry=http://registry.npm.taobao.org
  2. npm install sass-loader node-sass -D

29.element中el-select手动清除选中再次选择不显示的问题

https://blog.csdn.net/weixin_39407291/article/details/108128224

  1. 使用的是强制刷新的方法: this.$forceUpdate()
  2. 在切换不显示的el-select的元素上绑定@change=“changeValue
  3. changeValue(){
  4. this.$forceUpdate()
  5. }

30.vue 兄弟组件互相调用方法

https://blog.csdn.net/hujiaojiao525/article/details/89226893

31、node 升级后 无法运行

https://www.cnblogs.com/happymental/p/11544373.html

npm rebuild node-sass
npm update