md-textarea.vue 2.5 KB
Newer Older
璃白.'s avatar
璃白. 已提交
1 2 3 4 5 6 7
<template>
  <div :class="['md_textarea', { fullScreen }]">
    <textarea
      :id="id"
      @change="setText(textContent)"
      @focus="setFocus(true)"
      @blur="setFocus(false)"
G
guoweijia 已提交
8
      @paste="pasteFile"
璃白.'s avatar
璃白. 已提交
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
      v-model="textContent"
      rows="10"
    >
    </textarea>
    <span
      @click="setFullScreen(false)"
      v-if="fullScreen"
      class="icon iconfont icon-quxiaoquanping_o"
    ></span>
  </div>
</template>
<script>
import { mapState, mapMutations } from "vuex";
import { getSelectionInfo } from "@/assets/js/utils";
export default {
  data() {
    return {
      id: new Date().getTime(),
      isFocus: false,
      textContent: ""
    };
  },
  created() {
    document.addEventListener("mouseup", this.checkSelection);
  },
  watch: {
    text: {
      immediate: true,
      handler: function(val) {
        this.textContent = val;
      }
    }
  },
  beforeDestroy() {
    document.removeEventListener("mouseup", this.checkSelection);
  },
  computed: {
    ...mapState(["text", "fullScreen"])
  },
  methods: {
    ...mapMutations([
      "setText",
      "setFullScreen",
      "setSelectionInfo",
      "setFocus"
    ]),
    checkSelection() {
      const info = getSelectionInfo(this.id);
      if (!info) return;
      this.setSelectionInfo(info);
G
guoweijia 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71
    },
    pasteFile(event) {
      let fileList = [];
      const items = (event.clipboardData || window.clipboardData).items;
      for (let i = 0; i < items.length; i++) {
        console.log(items[i]);
        if (items[i].type.indexOf("image") !== -1) {
          fileList.push(items[i].getAsFile());
          break;
        }
      }
      if (!fileList.length) return;
      console.log(fileList);
璃白.'s avatar
璃白. 已提交
72 73 74 75 76 77 78 79
    }
  }
};
</script>
<style lang="less" scoped>
.md_textarea {
  position: relative;
  padding: 10px 0;
G
guoweijia 已提交
80
  background: #fff;
璃白.'s avatar
璃白. 已提交
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
  &.fullScreen {
    position: fixed;
    width: 100vw;
    height: 100vh;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    z-index: 99;
    padding: 40px 60px;
    box-sizing: border-box;
    textarea {
      font-size: 20px;
    }
  }
  textarea {
    display: block;
    width: 100%;
    height: 100%;
    box-sizing: border-box;
    color: var(--md-editor-text-color);
    resize: none;
    font-family: "Menlo", "DejaVu Sans Mono", "Liberation Mono", "Consolas",
      "Ubuntu Mono", "Courier New", "andale mono", "lucida console", monospace;
  }
  .icon {
    position: absolute;
    top: 20px;
    right: 20px;
    font-size: 32px;
    cursor: pointer;
  }
}
</style>