提交 e504e13c 编写于 作者: 璃白.'s avatar 璃白. 🌻

feat:初始化编辑器

上级 c97c8733
{ {
"scripts": { "scripts": {
"dev": "webpack serve --mode=development", "start": "webpack serve --mode=development",
"build": "webpack --mode=production" "build": "webpack --mode=production"
}, },
"devDependencies": { "devDependencies": {
......
...@@ -3,7 +3,10 @@ ...@@ -3,7 +3,10 @@
<markdown-header /> <markdown-header />
<markdownPreview v-if="showPreview" /> <markdownPreview v-if="showPreview" />
<markdown-editor v-else /> <markdown-editor v-else />
<markdown-footer v-if="!showPreview" /> <markdown-footer
:can-attach-file="canAttachFile"
v-if="!showPreview && canAttachFile"
/>
</div> </div>
</template> </template>
<script> <script>
...@@ -19,8 +22,9 @@ export default { ...@@ -19,8 +22,9 @@ export default {
markdownEditor, markdownEditor,
markdownPreview markdownPreview
}, },
computed: { computed: {
...mapState(["showPreview", "isFocus"]) ...mapState(["showPreview", "isFocus", "canAttachFile"])
} }
}; };
</script> </script>
...@@ -28,13 +32,13 @@ export default { ...@@ -28,13 +32,13 @@ export default {
.md_container { .md_container {
width: 1000px; width: 1000px;
margin: 200px auto; margin: 200px auto;
border: 1px solid var(--md-editor-theme-color); border: 1px solid var(--md-editor-border-color);
border-radius: 4px; border-radius: 4px;
padding: 10px 16px; padding: 10px 16px;
box-sizing: border-box; box-sizing: border-box;
transition: border 0.3s; transition: border 0.3s;
&.active { &.active {
border: 1px solid var(--md-editor-theme-color-active); border: 1px solid var(--md-editor-border-color-active);
} }
} }
</style> </style>
// 获取选中文本信息
export function getSelectionInfo(selectorId) { export function getSelectionInfo(selectorId) {
const selector = document.getElementById(selectorId); const selector = document.getElementById(selectorId);
// const selection = window.getSelection(); // const selection = window.getSelection();
...@@ -9,6 +10,7 @@ export function getSelectionInfo(selectorId) { ...@@ -9,6 +10,7 @@ export function getSelectionInfo(selectorId) {
}; };
} }
// 工具栏格式化文本
export function formatText(text, selectionInfo, startStr = "", endStr = "") { export function formatText(text, selectionInfo, startStr = "", endStr = "") {
if (!selectionInfo) return text + startStr + endStr; if (!selectionInfo) return text + startStr + endStr;
return ( return (
...@@ -19,3 +21,41 @@ export function formatText(text, selectionInfo, startStr = "", endStr = "") { ...@@ -19,3 +21,41 @@ export function formatText(text, selectionInfo, startStr = "", endStr = "") {
text.slice(selectionInfo.selectionEnd) text.slice(selectionInfo.selectionEnd)
); );
} }
// 初始化样式
export function initStyle({
borderColor,
borderColorActive,
textColor,
textColorActive
}) {
if (borderColor) {
document.documentElement.style.setProperty(
"--md-editor-border-color",
borderColor
);
}
if (borderColorActive) {
document.documentElement.style.setProperty(
"--md-editor-border-color-active",
borderColorActive
);
}
if (textColor) {
document.documentElement.style.setProperty(
"--md-editor-text-color",
textColor
);
}
if (textColorActive) {
document.documentElement.style.setProperty(
"--md-editor-text-color-active",
textColorActive
);
}
}
//
export function isNotEmpty(val) {
return val !== null && val !== undefined;
}
@import "./variable.less"; @import "./variable.less";
@import "./iconfont.less"; @import "./iconfont.less";
@import './markdown.less';
* { * {
padding: 0; padding: 0;
......
.htmledit_views address,
.htmledit_views cite,
.htmledit_views dfn,
.htmledit_views em,
.htmledit_views i,
.htmledit_views span[lang],
.htmledit_views var {
font-style: italic;
}
.htmledit_views {
font-family: -apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB,
Microsoft YaHei, WenQuanYi Micro Hei, sans-serif, SimHei, SimSun;
}
.cke_editable {
margin: 24px;
word-wrap: break-word;
}
.htmledit_views img.right {
border: 1px solid #ccc;
float: right;
margin-left: 15px;
padding: 5px;
}
.htmledit_views img.left {
border: 1px solid #ccc;
float: left;
margin-right: 15px;
padding: 5px;
}
.htmledit_views .marker {
background-color: #ff0;
}
.htmledit_views figure {
text-align: center;
margin: 0 24px;
display: inline-block;
}
.htmledit_views figure > figcaption {
text-align: center;
margin: 8px;
color: #999;
font-size: 14px;
display: block;
}
.htmledit_views a > img {
padding: 1px;
margin: 1px;
border: none;
outline: #0782c1 solid 1px;
}
.htmledit_views .code-featured {
border: 5px solid red;
}
.htmledit_views .math-featured {
padding: 20px;
box-shadow: 0 0 2px rgba(200, 0, 0, 1);
background-color: rgba(255, 0, 0, 0.05);
margin: 10px;
}
.htmledit_views .image-clean {
border: 0;
background: 0 0;
padding: 0;
}
.htmledit_views .image-clean > figcaption {
font-size: 0.9em;
text-align: right;
}
.htmledit_views .image-grayscale {
background-color: #fff;
color: #666;
}
.htmledit_views .image-grayscale img,
.htmledit_views img.image-grayscale {
filter: grayscale(100%);
}
.htmledit_views .embed-240p {
max-width: 426px;
max-height: 240px;
margin: 0 auto;
}
.htmledit_views .embed-360p {
max-width: 640px;
max-height: 360px;
margin: 0 auto;
}
.htmledit_views .embed-480p {
max-width: 854px;
max-height: 480px;
margin: 0 auto;
}
.htmledit_views .embed-720p {
max-width: 1280px;
max-height: 720px;
margin: 0 auto;
}
.htmledit_views .embed-1080p {
max-width: 1920px;
max-height: 1080px;
margin: 0 auto;
}
.htmledit_views p {
font-size: 18px;
color: #4d4d4d;
font-weight: 400;
line-height: 26px !important;
margin: 0 0 16px;
overflow-x: auto;
overflow-y: hidden;
}
p[align="center"] {
text-align: center;
}
.htmledit_views img {
max-width: 100%;
height: auto;
}
.htmledit_views strong,
.htmledit_views strong span {
font-weight: 700;
}
.htmledit_views * {
box-sizing: border-box;
}
.htmledit_views h1,
.htmledit_views h2,
.htmledit_views h3,
.htmledit_views h4,
.htmledit_views h5,
.htmledit_views h6 {
color: #4f4f4f;
margin: 8px 0 16px;
font-weight: 700;
}
.htmledit_views ol,
.htmledit_views ul {
margin: 0 0 24px;
padding: 0;
font-size: 16px;
}
.htmledit_views ul ol {
margin: 0 0 24px 32px;
}
.htmledit_views ul li {
list-style-type: disc;
margin: 8px 0 0 32px;
}
.htmledit_views ol li {
list-style-type: decimal;
margin-left: 40px;
margin-top: 8px;
}
.htmledit_views h1 {
font-size: 28px;
line-height: 36px;
}
.htmledit_views h2 {
font-size: 24px;
line-height: 32px;
}
.htmledit_views h3 {
font-size: 22px;
line-height: 30px;
}
.htmledit_views h4 {
font-size: 20px;
line-height: 28px;
}
.htmledit_views h5 {
font-size: 18px;
line-height: 26px;
}
.htmledit_views h6 {
font-size: 16px;
line-height: 24px;
}
.htmledit_views blockquote {
display: block;
padding: 16px 16px 0;
margin: 0 0 24px;
border-left: 8px solid #dddfe4;
background: #eef0f4;
overflow: auto;
overflow-scrolling: touch;
word-wrap: normal;
word-break: normal;
}
.htmledit_views blockquote ol,
.htmledit_views blockquote ul {
margin-bottom: 16px;
padding: 0;
font-size: 16px;
line-height: 24px;
}
.htmledit_views blockquote ol li,
.htmledit_views blockquote ul li {
margin-bottom: 0;
}
.htmledit_views blockquote p {
font-size: 16px;
line-height: 26px;
font-weight: 400;
margin-bottom: 16px;
color: #4f4f4f;
}
.htmledit_views hr {
margin: 24px 0;
border: none;
border-bottom: solid #ccc 1px;
}
.htmledit_views table tr {
border: 0;
border-top: 1px solid #ddd;
background-color: #fff;
}
.htmledit_views table {
border-collapse: collapse;
display: table;
width: 100%;
text-align: left;
margin-bottom: 24px;
margin-left: auto;
margin-right: auto;
}
.htmledit_views tbody {
border: 0;
}
.htmledit_views table tr:nth-child(2n) {
background-color: #f7f7f7;
}
.htmledit_views table tr td,
.htmledit_views table tr th {
border: 1px solid #ddd;
font-size: 14px;
color: #4f4f4f;
line-height: 22px;
padding: 8px;
text-align: left;
}
.htmledit_views table tr td p,
.htmledit_views table tr th p {
font-size: 14px;
color: #4f4f4f;
margin: 0;
padding: 0;
text-align: left;
line-height: 22px;
}
.htmledit_views table tr th p {
font-weight: 700;
}
.htmledit_views table tr td code,
.htmledit_views table tr th code {
white-space: normal;
word-break: break-word;
}
.htmledit_views table tr th {
font-weight: 700;
background-color: #eff3f5;
}
.htmledit_views dl {
margin: 24px;
}
.htmledit_views dl dt {
margin: 8px;
font-weight: 700;
}
.htmledit_views dl dt dd {
margin: 8px;
}
.htmledit_views abbr[data-original-title],
.htmledit_views abbr[title] {
cursor: help;
border-bottom: 1px dotted #999;
}
.htmledit_views .initialism {
font-size: 90%;
text-transform: uppercase;
}
.htmledit_views pre {
white-space: pre-wrap;
word-wrap: break-word;
margin: 0 0 24px;
overflow-x: auto;
padding: 8px;
}
.marker {
background-color: #ff0;
}
htmledit_views img.mathcode {
margin: 0 8px;
}
.htmledit_views kbd,
.htmledit_views pre,
.htmledit_views samp {
font-family: Consolas, Inconsolata, Courier, monospace;
font-size: 14px;
line-height: 22px;
color: #000;
}
.htmledit_views code ol li div.hljs-ln-code,
.htmledit_views code ol li div.hljs-ln-numbers,
.htmledit_views pre code,
.htmledit_views pre code div,
.htmledit_views pre code span {
font-family: "Source Code Pro", "DejaVu Sans Mono", "Ubuntu Mono",
"Anonymous Pro", "Droid Sans Mono", Menlo, Monaco, Consolas, Inconsolata,
Courier, monospace, "PingFang SC", "Microsoft YaHei", sans-serif;
}
.htmledit_views code {
border-radius: 4px;
}
.htmledit_views a {
color: #4ea1db;
text-decoration: none;
}
.htmledit_views a:focus,
.htmledit_views a:hover {
color: #ca0c16;
}
.htmledit_views a:visited {
color: #6795b5;
}
.htmledit_views .hot-keyword:visited {
color: #3399ea;
}
.htmledit_views .footnote {
vertical-align: top;
position: relative;
top: -4px;
font-size: 12px;
}
.htmledit_views .flow-chart,
.htmledit_views .sequence-diagram {
text-align: center;
margin-bottom: 24px;
font-size: 14px !important;
}
.htmledit_views .flow-chart [fill="#000"],
.htmledit_views .flow-chart [fill="#000000"],
.htmledit_views .flow-chart [fill="black"],
.htmledit_views .sequence-diagram [fill="#000"],
.htmledit_views .sequence-diagram [fill="#000000"],
.htmledit_views .sequence-diagram [fill="black"] {
fill: #4f4f4f;
}
.htmledit_views .flow-chart [stroke="#000000"],
.htmledit_views .sequence-diagram [stroke="#000000"] {
stroke: #4f4f4f;
}
.htmledit_views .MathJax_SVG_Display {
text-align: center;
margin: 24px 0;
font-size: 18px;
font-weight: 400;
color: #4f4f4f;
position: relative;
text-indent: 0;
max-width: none;
max-height: none;
min-width: 0;
min-height: 0;
width: 100%;
}
.htmledit_views pre code {
display: block;
line-height: 22px;
overflow-x: auto;
white-space: pre;
word-wrap: normal;
border-radius: 4px;
padding: 8px;
tab-size: 4;
}
.htmledit_views pre code code.hljs {
padding: 0;
}
.htmledit_views pre code:not(.hljs) {
background-color: #f3f4f5;
}
.htmledit_views pre code,
.htmledit_views pre code div,
.htmledit_views pre code span {
font-size: 14px;
}
.htmledit_views .prettyprint,
.htmledit_views pre.prettyprint {
margin: 0 0 24px;
padding: 8px 16px 4px 56px;
background-color: #f6f8fa;
border: none;
}
.htmledit_views .prettyprint .pre-numbering {
position: absolute;
width: 48px;
background-color: #eef0f4;
top: 0;
left: 0;
margin: 0;
padding: 8px 0;
list-style: none;
text-align: right;
}
.htmledit_views .pre-numbering li {
padding: 0 8px;
list-style: none;
margin: 0;
}
.htmledit_views dl dd {
margin: 0 0 8px 40px;
}
.htmledit_views kbd {
padding: 2px 8px;
border: 1px solid rgba(63, 63, 63, 0.25);
box-shadow: 0 1px 0 rgba(63, 63, 63, 0.25);
background-color: #fff;
color: #333;
border-radius: 4px;
display: inline-block;
margin: 0 2px;
white-space: nowrap;
}
.htmledit_views .dp-highlighter {
font-size: 12px;
text-align: left;
margin: 0 0 24px;
}
.htmledit_views code ol {
margin: 0;
overflow: hidden;
}
.htmledit_views code ol li {
list-style-type: none;
margin-left: 0;
margin-top: 0;
height: 22px;
}
.htmledit_views code ol li div.hljs-ln-code {
margin-left: 8px;
}
.htmledit_views code ol li div.hljs-ln-code,
.htmledit_views code ol li div.hljs-ln-numbers {
float: left;
height: 22px;
}
.htmledit_views code ol li div.hljs-ln-numbers {
width: 24px;
border-right: 1px solid #c5c5c5;
}
.htmledit_views code ol li div.hljs-ln-numbers .hljs-ln-line {
word-wrap: normal;
}
.htmledit_views code ol.hundred li div.hljs-ln-numbers {
width: 30px;
}
.htmledit_views code ol.thousand li div.hljs-ln-numbers {
width: 36px;
}
.htmledit_views .csdn-data-video {
width: 200px;
}
.htmledit_views .csdn-data-video img {
margin: 0;
display: block;
width: 200px;
height: 112px;
}
.htmledit_views .csdn-data-video p {
margin-top: 10px;
margin-bottom: 0;
font-size: 14px;
}
.htmledit_views pre[data-from="code-for-outside"] {
overflow: hidden;
}
.htmledit_views pre[data-from="code-for-outside"] code {
overflow-x: auto;
overflow-y: hidden;
}
.htmledit_views pre[data-from="code-for-outside"] code * {
overflow: visible;
overflow-wrap: break-word;
}
.htmledit_views pre[data-from="code-for-outside"] p code {
padding: 0;
}
:root { :root {
--md-editor-theme-color: #dbdbdb; --md-editor-border-color: #dbdbdb;
--md-editor-theme-color-active: #409eff; --md-editor-border-color-active: #409eff;
--md-editor-text-color: #303030; --md-editor-text-color: #303030;
--md-editor-text-color-active: #000; --md-editor-text-color-active: #000;
} }
<template> <template>
<div class="md_preview"> <div class="htmledit_views">
<div v-html="html"></div> <div v-html="html"></div>
</div> </div>
</template> </template>
...@@ -32,7 +32,7 @@ export default { ...@@ -32,7 +32,7 @@ export default {
}; };
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.md_preview { .htmledit_views {
min-height: 170px; min-height: 170px;
padding: 10px 0; padding: 10px 0;
box-sizing: border-box; box-sizing: border-box;
......
<template> <template>
<div :class="['md_footer', { active: isFocus }]"> <div :class="['md_footer', { active: isFocus }]">
<div class="doc"></div> <div class="doc"></div>
<upload-files /> <upload-files v-if="canAttachFile" />
</div> </div>
</template> </template>
<script> <script>
...@@ -9,11 +9,8 @@ import uploadFiles from "./upload-files"; ...@@ -9,11 +9,8 @@ import uploadFiles from "./upload-files";
import { mapState } from "vuex"; import { mapState } from "vuex";
export default { export default {
components: { uploadFiles }, components: { uploadFiles },
data() {
return {};
},
computed: { computed: {
...mapState(["isFocus"]) ...mapState(["isFocus", "canAttachFile"])
} }
}; };
</script> </script>
...@@ -22,14 +19,14 @@ export default { ...@@ -22,14 +19,14 @@ export default {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
border-top: 1px solid var(--md-editor-theme-color); border-top: 1px solid var(--md-editor-border-color);
padding-top: 10px; padding-top: 10px;
box-sizing: border-box; box-sizing: border-box;
font-size: 14px; font-size: 14px;
color: var(--md-editor-text-color); color: var(--md-editor-text-color);
transition: border-top 0.3s; transition: border-top 0.3s;
&.active { &.active {
border-top: 1px solid var(--md-editor-theme-color-active); border-top: 1px solid var(--md-editor-border-color-active);
} }
} }
</style> </style>
<template> <template>
<div class="upload_files" @click="upload"> <div class="upload_files" @click="$refs.mdUploadFile.click()">
<span class="icon iconfont icon-tupian"></span> <span class="icon iconfont icon-tupian"></span>
<input
ref="mdUploadFile"
class="md_upload"
type="file"
name="md-upload-file"
id="md-upload-file"
@change="upload"
multiple
/>
<span>添加附件</span> <span>添加附件</span>
</div> </div>
</template> </template>
<script> <script>
import { mapState, mapMutations } from "vuex";
import { formatText } from "@/assets/js/utils";
export default { export default {
data() { data() {
return {}; return {};
}, },
computed: {
...mapState(["text", "selectionInfo"])
},
methods: { methods: {
upload() {} ...mapMutations(["setText"]),
upload(e) {
const fileList = Array.from(e.target.files);
console.log(fileList);
fileList.forEach(item => {
console.log(item);
// const formData = new formData();
// formData.append("file", item);
this.updateText(
"![",
"](data:image/jpeg;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/Z)"
);
});
},
updateText(startStr, endStr) {
const selectionInfo = this.selectionInfo;
const originalText = this.text;
const newText = formatText(originalText, selectionInfo, startStr, endStr);
if (!newText) return;
this.setText(newText);
}
} }
}; };
</script> </script>
...@@ -23,9 +57,12 @@ export default { ...@@ -23,9 +57,12 @@ export default {
cursor: pointer; cursor: pointer;
display: inline-block; display: inline-block;
vertical-align: bottom; vertical-align: bottom;
&:hover { }
color: var(--md-editor-text-color-active); &:hover {
} color: var(--md-editor-text-color-active);
}
.md_upload {
display: none;
} }
} }
</style> </style>
...@@ -43,9 +43,9 @@ export default { ...@@ -43,9 +43,9 @@ export default {
align-items: center; align-items: center;
height: 32px; height: 32px;
transition: border-bottom 0.3s; transition: border-bottom 0.3s;
border-bottom: 1px solid var(--md-editor-theme-color); border-bottom: 1px solid var(--md-editor-border-color);
&.active { &.active {
border-bottom: 1px solid var(--md-editor-theme-color-active); border-bottom: 1px solid var(--md-editor-border-color-active);
} }
.header_tabs { .header_tabs {
display: flex; display: flex;
...@@ -76,7 +76,7 @@ export default { ...@@ -76,7 +76,7 @@ export default {
color: var(--md-editor-text-color-active); color: var(--md-editor-text-color-active);
&::after { &::after {
width: 100%; width: 100%;
background: var(--md-editor-theme-color); background: var(--md-editor-border-color);
} }
} }
&.active { &.active {
...@@ -84,7 +84,7 @@ export default { ...@@ -84,7 +84,7 @@ export default {
font-weight: 700; font-weight: 700;
&::after { &::after {
width: 100%; width: 100%;
background: var(--md-editor-theme-color-active); background: var(--md-editor-border-color-active);
} }
} }
& + .tab_item { & + .tab_item {
......
import Vue from "vue"; import Vue from "vue";
import App from "./App"; import App from "./App";
import store from "./store"; import store from "./store";
import { initStyle, isNotEmpty } from "@/assets/js/utils";
import "@/assets/style/global.less"; import "@/assets/style/global.less";
function initStyle(val) { function initMdEditor(obj) {
document.documentElement.style.setProperty( const { el, onChange, canAttachFile, themeOptions } = obj;
"--md-editor-theme-color-active",
val
);
}
function MdEditor(obj) {
const { el, onChange, themeActive } = obj;
if (!el || !document.querySelector(el)) throw new Error("请指定容器"); if (!el || !document.querySelector(el)) throw new Error("请指定容器");
initStyle(themeActive); if (isNotEmpty(themeOptions)) initStyle(themeOptions);
if (isNotEmpty(canAttachFile))
store.commit("setCanAttachFile", canAttachFile);
new Vue({ new Vue({
store, store,
...@@ -28,4 +24,4 @@ function MdEditor(obj) { ...@@ -28,4 +24,4 @@ function MdEditor(obj) {
}).$mount(el); }).$mount(el);
} }
window.MdEditor = MdEditor; window.MdEditor = initMdEditor;
...@@ -52,9 +52,10 @@ export default new Vuex.Store({ ...@@ -52,9 +52,10 @@ export default new Vuex.Store({
} }
], ],
ulNum: 1, ulNum: 1,
text: "4564564564657567\n3456456456456", text: "# 456456456\n## 4657567\n3456456456456",
selectionInfo: "", selectionInfo: "",
html: "" html: "",
canAttachFile: true
}, },
mutations: { mutations: {
setFullScreen(state, val) { setFullScreen(state, val) {
...@@ -68,6 +69,7 @@ export default new Vuex.Store({ ...@@ -68,6 +69,7 @@ export default new Vuex.Store({
}, },
setText(state, val) { setText(state, val) {
state.text = val; state.text = val;
state.selectionInfo = "";
}, },
setSelectionInfo(state, val) { setSelectionInfo(state, val) {
state.selectionInfo = val; state.selectionInfo = val;
...@@ -77,6 +79,9 @@ export default new Vuex.Store({ ...@@ -77,6 +79,9 @@ export default new Vuex.Store({
}, },
setUlNum(state, val) { setUlNum(state, val) {
state.ulNum = val; state.ulNum = val;
},
setCanAttachFile(state, val) {
state.canAttachFile = val;
} }
} }
}); });
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册