2022.10.31

98 阅读1分钟

1.解决blur事件中使用alert和focus循环弹框问题

在alert后先移除onblur事件,再添加onfocus事件和onblur事件

<input v-model="current.options.xAxis.data[index]" class="ipt" type="text" @blur="insertContent($event)">

insertContent(e) { // 失去焦点事件
  if (!e.target.value.trim()) {
    alert('输入框内容不能为空')
    e.target.onblur = ''
    setTimeout(function() {
      e.target.focus()
      e.target.onblur = this.insertContent
    }, 0)
  }
},

2.父元素设置了min-height,子元素高度设置为100%不生效,无法根据父级的高度自适应,而是根据自身内部元素撑开高度,若子元素设置了确定的高度,则高度设置是生效的

可以将父元素设置为相对定位(relative),子元素设置为绝对定位(absolute)

3. vue 报错 Cannot read property ‘_wrapper‘ of undefined

多半是因为使用了未定义的 方法

4.echarts重绘除了使用 echarts.dispose()方法和echartsInstance.clear()方法,还可以手动删除_echarts_instance属性,dom.removeAttribue('_echarts_instance')

4.echarts图标显示暂无数据

1.通过判断是否有渲染需要的图表数据,给 DOM 插入文字

if(this.chartData.series[0].data.length > 0){
    this.$nextTick(() => {
      this.charts = this.$echarts.init(this.$refs.chart);
      this.setOption();
      var _this = this;

      // 点击柱形图事件
      this.charts.on("click", (params) => {
        _this.$emit("getBar", params.name);
      });
    });
  } else {
    this.$nextTick(() => {
      var dom = this.$refs.chart
      dom.innerHTML = '暂无数据'
      dom.removeAttribute('_echarts_instance_')
    })
  }

(2) 通过 showLoading API 来实现

myChart = this.$echarts.init(this.$refs.chart);
myChart.setOption(option)
  if (!data.length) {
    myChart.showLoading({
      text: '暂无数据',
      showSpinner: false,
      textColor: 'black',
      maskColor: 'rgba(255, 255, 255, 1)',
      fontSize: '26px',
      fontWeight: 'bold'
    })
  } else {
  	myChart.hideLoading()
  }

(3)通过 给 options 增加 graphic 配置项来实现

graphic: {
   type: 'text',
   left: 'center',
   top: 'middle',
   silent: true,
   invisible: data.length == 0, //是否可见,这里的意思是当没有数据时可见
   style: {
     fill: 'black',
     fontWeight: 'bold',
     text: '暂无数据',
     fontSize: '26px'
   }
 }
// 实现原理是在图表上再增加一个图层,图层上写着暂无数据的提示。

5.父子组件生命周期,computed,watch执行顺序

一.加载渲染过程

父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted

2.更新过程

父beforeUpdate->子beforeUpdate->子updated->父updated

3.销毁过程

父beforeDestroy->子beforeDestroy->子destroyed->父destroyed

二.keep-alive的生命周期

  • activated: 页面第一次进入的时候,钩子触发的顺序是created->mounted->activated
  • deactivated: 页面退出的时候会触发deactivated,当再次前进或者后退的时候只触发activated

三.computed、watch

在created之前就会 就会进行初始化 computed 和 watch

image.png

看以下执行顺序图可以得出:

1.初始化时父元素 向 子元素传递数据分两个阶段,一为父元素父beforeMount及之前的一个阶段,包括data中定义的赋值;另一个阶段为,父元素mounted及其之后的阶段;在一个阶段中后面的赋值会替换前面的赋值;(如:父created 覆盖父data中定义的),所以watch 和 computed 会触发两次

2.watch有immediate属性: 首次绑定的时候,是否执行handler,为true时,在子元素的created之前执行;默认false 为false时 只有在父元素mounted之后值改变才会触发,否则是不会触发的;

3.computed 执行值computed被引用处(数据变更时 watch 在 computed 之前执行),然后继续执行computed代码;computed 最早在created之后执行

image.png

四.路由守卫

image.png

原文:www.cnblogs.com/voxov/p/152…

6.如何监听vuex中的数据变化

1.在vue文件中监听vuex数据变化

通过computed获取到vuex中的数据,在通过watch监听获取到的数据,做相应的操作

2.在非vue文件中监听vuex数据变化

vue官网提供了解决思路

watch(fn: Function, callback: Function, options?: Object): Function
vuex的实例方法,接收两个参数:
第一个参数为fn,响应式地侦听 fn 的返回值,当值改变时调用回调函数。fn 接收 store 的 state 作为第一个参数,其 getter 作为第二个参数;
第二个参数为一个可选的对象参数表示 ,类似于vue的watch的回调函数,表示新旧值。
当我们不想监听时,可以通过定义变量接收该方法的返回值函数,调用该函数即可停止监听。

优点:我们可以监听某个特定需要的值,并非常方便的类似vue文件中那样拿到新旧变化值
弊端:当我们需要知道很多的值的变更情况时就得写大量的监听方法(可以考虑封装成方法或类)

/* eslint-disable */
import store from  "../store/index";
const watchFun = store.watch(
    state => state.pathName,
    (newValue, oldValue) => {
       console.log("search string is changing");
       console.log("rd: newValue", newValue);
       console.log("rd: oldValue", oldValue);
    }
);
setTimeout(() => {
    watchFun();
}, 10000);
  • 在相应的js文件引入store
  • 调用store的watch实例方法,第一个函数参数返回一个需要监听的state中的值(比如我想监听vuex中的pathName的变化情况,就返回该值)
  • 第二个参数同vue的watch,接收2个参数代表新旧值
  • 通过变量watchFun接收watch的返回值,调用该方法会停止监听

原文:www.php.cn/vuejs/48161…

7.vue中通过this.$options.name获取到组件的name属性