easymode既然是个组件,那么验证不通过的提示信息我觉得可以这样优化下,老师帮瞅瞅

来源:10-10 集成 Easymde 编辑器 第四部分:结合页面完成功能

希望林柚一健康快乐成长

2022-04-19

Editor,将失焦事件进行抽离,用作检查,错误提示信息移植到组件内部,并且将blur事件导出,用于表格的submit事件对表格进行检验

<template>
  <div :class="['vue-easymode-editor', !editorStatus.isValid ? 'is-invalid' : '']">
    <textarea ref="textArea"></textarea>
  </div>
  <span v-if="!editorStatus.isValid" class="invalid-feedback mt-1">{{editorStatus.message}}</span>
</template>
<script lang="ts" setup>
import EasyMDE, { Options } from 'easymde'
import { defineProps, defineEmits, ref, onMounted, onUnmounted, defineExpose, reactive } from 'vue'
// 类型属性以及事件
interface EditorProps {
  modelValue?:string;
  Options?:Options;
}
interface EditorEvents {
  (type: 'update:modelValue', value: string):void
  (type: 'change', value:string):void
  (type: 'blur'):void
}
const props = defineProps<EditorProps>()
const emit = defineEmits<EditorEvents>()
// 有了模板后需要初始化的一些数据
// 1.暴露对应的方法
// 2.结合页面实现验证功能
const textArea = ref<null | HTMLTextAreaElement>(null)
let easyMDEInstance: EasyMDE | null = null
const innerValue = ref(props.modelValue || '')
const editorStatus = reactive({
  isValid: true,
  message: ''
})
onMounted(() => {
  if (textArea.value) {
    // 组装options
    const config: Options = {
      ...(props.Options || {}),
      element: textArea.value,
      initialValue: innerValue.value
    }
    easyMDEInstance = new EasyMDE(config)
    // 监控对应的事件
    easyMDEInstance.codemirror.on('change', () => {
      if (easyMDEInstance) {
        const updateValue = easyMDEInstance.value()
        innerValue.value = updateValue
        // 将对应的事件发射出去,让父组件进行捕获
        emit('update:modelValue', updateValue)
        emit('change', updateValue)
      }
    })
    easyMDEInstance.codemirror.on('blur', () => {
      if (easyMDEInstance) {
        // 暴露失焦事件,用户写自己的业务
        emit('blur')
        // 组件内部功能,失焦检验输入是否合法
        blur()
      }
    })
  }
})
onUnmounted(() => {
  if (easyMDEInstance) {
    easyMDEInstance.cleanup()
  }
  easyMDEInstance = null
})
// 清空编辑器
const clear = () => {
  if (easyMDEInstance) {
    // value方法不传参数,取值,传入就是赋值,类似jq的value方法
    easyMDEInstance.value('')
  }
}
// 编辑器的失焦事件
const blur = () => {
  if (easyMDEInstance) {
    const currentValue = easyMDEInstance.value()
    if (currentValue.trim() === '') {
      editorStatus.isValid = false
      editorStatus.message = '文章详情不能为空'
    } else {
      editorStatus.isValid = true
      editorStatus.message = ''
    }
    return editorStatus.isValid
  }
}
// 返回组件的实例
const getMDEInstance = () => {
  return easyMDEInstance
}
defineExpose({
  clear,
  getMDEInstance,
  // editorStatus,
  blur
})
</script>
<style lang="scss">
.vue-easymode-editor.is-invalid {
  border:1px solid #dc3545;
}
</style>


createPost.vue组件,当提交表单的时候进行如下改造:

接受一个blur函数,返回布尔值
interface editorInstance {
  clear: () => void;
  getMDEInstance: () => EasyMDE | null,
  blur: () => boolean
}
    const onFormSubmit = (result: boolean) => {
    // 如果用户使用了easymode组件,验证输入是否合法
      let flag = true
      if (editorRef.value) {
        flag = editorRef.value.blur()
      }
      if (result && flag) {
        const { column, _id } = store.state.user
        if (column) {
          const newPost:PostProps = {
            title: titleVal.value,
            content: contentVal.value,
            column,
            author: _id
          }
          if (imageId) {
            newPost.image = imageId
          }
          store.dispatch('fetchNewPost', newPost).then(() => {
            console.log('新建文章接口是否成功')
            messageNode = createMessage('新文章创建成功!2秒后跳往详情页面', 'success')
            setTimeout(() => {
              messageNode.destory()
              router.push({ name: 'column', params: { id: column } })
            }, 2000)
          })
        }
      }
    }
写回答

1回答

张轩

2022-04-20

同学你好

很好的思考 而且很棒的实现 其实在做课的时候也当然会有有这样的想法

这其实就是一个问题:是否要将 easymde 组件近一步抽象,比如给他添加另外的状态,比如错误什么,成功什么的。还是不添加这些,它完成的任务只是一个 easymde 组件,没有更多的功能,让使用它的父组件去添加。这两种做法各有利弊,可以自行选择。

1
1
希望林柚一健康快乐成长
好的,谢谢老师~
2022-04-20
共1条回复

Vue3 + TS 仿知乎专栏企业级项目

带你完成前后端分离复杂项目,率先掌握 vue3 造轮子技能

3142 学习 · 2313 问题

查看课程