vue - 问题汇总

*时间区间选择器,控制时间区间

 <el-date-picker
            v-model="state.searchForm.date"
            type="datetimerange"
            :default-time="defaultTimeRange"
            value-format="YYYY-MM-DD HH:mm:ss"
            range-separator="-"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
            :disabled-date="disabledDate"
            @calendar-change="calendarChange"
            :clearable="true"
          />



function calendarChange(e) {
  state.minDate = e[0].getTime();
}
//时间筛选范围一个月
function disabledDate(time) {
  return (
    time.getTime() <= moment(state.minDate).subtract(6, 'month').valueOf() ||
    time.getTime() >= moment(state.minDate).add(6, 'month').valueOf()
  );
}
  • 居中布局
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
  • 自定义指令
export default function (app) {
  app.directive("special-chars", {
    mounted(el, binding, vnode) {
      el.addEventListener("input", function (event) {
        // 获取输入的值
        const value = event.target.value;
        // 使用正则表达式检测反斜杠(根据需要匹配相应限制字符)
        const regex =
          /[`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、]/g;
        // 如果输入值包含反斜杠,则替换为空格
        if (regex.test(value)) {
          // 使用 replace 方法替换反斜杠为空格
          const newValue = value.replace(regex, "");
          // 将新值设置回输入框
          event.target.value = newValue;
          // 触发 @input 事件,使其更新组件中的数据
          //   vnode.componentInstance.$emit("input", newValue);
          // 触发input事件来更新绑定的v-model值
          el.dispatchEvent(new Event("input", { bubbles: true }));
        }
      });
    },
    unmounted(el) {
        el.removeEventListener('input');
      }
  });
}

  • 下载通知
// 下载视频
    downLoad(item, tab) {
      this.downLoadIndex++
      const notify = this.$notify({
        title: 'Work start download',
        message: `<div id='notify-${this.downLoadIndex}'>The video is downloading, progress is 0%, please wait</div>`,
        dangerouslyUseHTMLString: true,
        type: 'success',
        duration: 0,
      })

      this.downLoadFile(item, this.downLoadIndex, tab)
        .then(() => {
          notify.close()
          this.$notify({
            title: 'Work download completed',
            type: 'success',
            duration: 3000,
          })
        })
        .catch(() => {
          notify.close()
          this.$notify({
            title: 'Work download failed',
            type: 'error',
            duration: 3000,
          })
        })
    },
    downLoadFile(item, index, tab) {
      let url = ''
      if (tab == 'avatar') {
        url = item.audioUrl
      } else {
        url = item.videoUrl
      }
      let name = item.workName + '_Anylang-ai'

      return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest()
        xhr.open('GET', url, true)
        xhr.send()
        xhr.responseType = 'blob'
        xhr.addEventListener('progress', (ev) => {
          const percent = parseInt((ev.loaded / ev.total) * 100)
          const dom = document.getElementById(`notify-${index}`)
          dom.innerText = `The video is downloading, progress is ${percent}%, please wait`
        })
        xhr.onload = (ev) => {
          if (xhr.status == 200) {
            const urlx = window.URL.createObjectURL(xhr.response)
            const dom = document.createElement('a')
            dom.href = urlx
            dom.download = name
            dom.click()
            URL.revokeObjectURL(dom.href)
            resolve()
          } else if (response.status == 404) {
            reject()
          } else if (response.status == 500) {
            reject()
          }
        }
      })
    },
  • 分享一些::after和::before使用的经验

&:before画圆


<template>
    <div>
         <div class="title">今日新增量</div >
    <div/>
<template>
<style>
title {
          position: relative;
          &:before {
          // top: 5px;
          // left: -15px;
          position: absolute;
          display: block;
          width: 10px;
          height: 10px;
          border-radius: 50%;
          background: #fa6861;
          content: '';
          }
    }
<style/>

&:before竖条

<template>
    <div>
         <div class="title">前面加个竖条</div >
    <div/>
<template>
<style>
 .title {
        position: relative;
        &:before {
          top: 25px;
          left: 80px;
          position: absolute;
          display: block;
          width: 6px;
          height: 30px;
          background: #4d99f9;
          content: '';
        }
    }
<style/>

&:before插入图片

<template>
    <div>
         <div class="title">前面加个图片</div >
    <div/>
<template>
<style>
.title {
        position: relative;
        &:before {
          content: '';
          position: absolute;
          left: 75px;
          top: 26px;
          height: 28px;
          width: 12px;
          background: url('~@/assets/images/second-title.png') no-repeat;
          background-size: 100% 100%;
        }
    }
<style/>
  • 一行文字过多时,省略号隐藏显示

1.页面部分
<el-row>
  <el-col :span="24">
    <div class="information-title">
     一行文字过多时,隐藏省略显示;一行文字过多时,隐藏省略显示;一行文字过多时,隐藏省略显示;
     一行文字过多时,隐藏省略显示;一行文字过多时,隐藏省略显示;一行文字过多时,隐藏省略显示;
     一行文字过多时,隐藏省略显示;一行文字过多时,隐藏省略显示;一行文字过多时,隐藏省略显示;
    </div>
  </el-col>
</el-row>
2.css样式部分
.information-title {
  color: #19d3ea;
  font-size: 18px;
  width: 100%;   /*一定要设置宽度,或者元素内含的百分比*/
  overflow:hidden; /*溢出的部分隐藏*/
  white-space: nowrap; /*文本不换行*/
  text-overflow:ellipsis;/*ellipsis:文本溢出显示省略号(...);clip:不显示省略标记(...),而是简单的裁切*/
  • 防止被压缩
flex-shrink: 0;
  • vue3 使用类似.sync的功能:
// 父组件
  <child-modal v-model:visible="visible"></child-modal>
// 子组件
<template>
  <a-modal v-model:visible="show" title="Basic Modal" @ok="handleOk">
    <p>Some contents...</p>
    <p>Some contents...</p>
    <p>Some contents...</p>
  </a-modal>
</template>

<script setup>
import { computed, defineProps, defineEmits} from 'vue'
const props = defineProps({
  visible: {
    type: Boolean,
    default: false,
  },
})
const $emit = defineEmits(['update:visible'])
const show = computed({
  get() {
    return props.visible
  },
  set(v) {
    $emit('update:visible', v)
  },
})
const handleOk = e => {
  console.log(e)
  show.value = false
}
</script>

  • Promise

Promise有三种状态,分别是“待定”、“已完成”和“已拒绝”。当一个Promise被创建时,它处于“待定”状态。当操作成功完成时,Promise进入“已完成”状态,并返回一个包含操作结果的值。当操作失败时,Promise进入“已拒绝”状态,并返回一个包含错误信息的原因。

Promise可以链式调用,这使得它们可以更方便地组合异步操作。Promise还可以通过catch()方法来处理错误,这使得代码的错误处理更加容易。

链式调用(实现同步操作):
下面直接return值,是因为Promise会自动用Promise包裹


image.png
  • 列表网格排列:


    image.png
// 进度条随机值
    addIntervalProgress() {
      //取[10, 20]之间的随机整数
      this.currentProgress = Math.floor(Math.random() * (20 - 10 + 1)) + 10;
      // console.log("1111 ---- ", this.currentProgress);
      let timer = setInterval(() => {
        this.currentProgress += Math.floor(Math.random() * 5);
        // console.log("2222 ---- ", this.currentProgress);

        if (this.currentProgress > 99) {
          this.currentProgress = 99;
          clearInterval(timer);
        }
      }, 100);
    },
  • H5 播放rtsp视频流
    前段目前不支持直接播放这种格式,一般都是通过把rtsp擦、转成前段支持的格式
    1、https://cloud.tencent.com/developer/article/1805057
    VLC是一个不错的Chrome播放rtsp视频流方案,延迟低,性能稳定。但是从2015年以后,Chrome等浏览器取消对NPAPI支持后,VLC就不能直接使用了

  • mac可以用node.js的多版本管理器n来升级和切换,命令如下:

1、sudo npm cache clean -f //清除node.js的cache

2、sudo npm install -g n //使用npm安装n模块

3、npm view node versions // 查看node所有版本

4、sudo n latest // 升级到最新版本

      sudo n stable // 升级到稳定版本

      sudo n xx.xx // 升级到具体版本号

5、node -v  //查看当前安装的版本号

6、n   //检查目前安装了哪些版本的node,会出现已安装的node版本,选一个就可以直接切换了
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容