<template>
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">markedown编辑器</h3>
<input type="text" v-model = 'title' placeholder="请输入笔记标题">
<button class='btn btn-success' @click = 'addNote'>提交</button>
</div>
<div class="panel-body">
<div class="marked">
<!-- cols="70" rows="25"分别是列和行,控制编辑器的宽度和高度 -->
<textarea cols="70" rows="25" v-model = 'msg'></textarea>
</div>
<div class="show" v-html = 'currentMsg'>
<!-- {{msg}} -->
<!-- {{currentMsg}} -->
</div>
</div>
</div>
</div>
<!-- 如何实现提交笔记?(屯一个空数组,将数据传至数组中) -->
<!-- 1.data中屯一个空数组,以便将数据传至 -->
<!-- 2.v-for遍历数组;设置title及content,即数组是字典即对象 -->
<!-- 3.button提交按钮,要实现点击按钮提交数据,因此要添加@click事件addNote-->
<!-- 4.标题、内容填写完之后要提交;首先标题:填写完之后要点提交(保存),
即要对input标签使用v-model并在data中设置title空字符串,在函数addNote中
console.log(this.title)打印显示标题即表示可以拿到title;
内容:获取内容部分即textarea内容,我们要获取currentMsg内容,
因为我们要拿到###后边输出的内容,在函数addNote中
console.log(this.currentMsg)打印显示标签,但是我们只需要内容,
此时item.content是一个标签,对div标签添加v-html对item.content进行解析,
然后在渲染标签时只输出内容;-->
<!-- 5.创建obj对象,使用this.lists.push(obj); 实现将数据提交至数组中-->
<!-- 6.实现点击提交内容之后将内容清空:this.title = ''; this.msg = ''; -->
<!-- lists是后端请求数据库得到的,即在添加数据就是用ajax请求添加 -->
<div class="lists">
<ul>
<li v-for = '(item,index) in lists'>
<h3>{{item.title}}</h3>
<div v-html = 'item.content'></div>
</li>
</ul>
</div>
</div>
</div>
</template>
<script>
//Markedown实现//
// 步骤:(左边编辑,右边渲染)
// 1.div或bootstrap布局,创建markedown组件,
// 2.渲染组件:首先在数组routes中写入markedown及src(即在导航栏加上markedown)
// 3.添加路由:引入markedown组件(import),抛出(export)中写入markedown相关path、name等
// 4.npm install marked下载
// 5.引入Marked
// 6.textarea渲染值的指令是v-model(表单控件),设置渲染值为msg,并设置为空,接下来show中(右边)需要将msg监听起来,使用{{msg}},即双向数据绑定
// 7.现在已实现右边编辑,左边呈现功能;但是###还没有实现,需要使用markedown模块编译
// 8.computed监听,currentMsg函数,默认get方法;textarea输入内容,Marked(this.msg)监听到并编译解析,
此时return Marked(this.msg)返回的currentMsg是标签
// 注:# 123!!!#与内容之间一定要有空格
// 9.marked解析并直接呈现出h1标签,此时我们需要将标签插到html中,此时用{{}}实现不了,需要用v-html即可
import Marked from 'marked'/*(后边的名字必须与package.json中的marked一致,前边的名字与组件名一致就可)*/
export default {
name: 'marked',
data(){
return {
msg:'',
lists:[],
title:''
}
},
methods:{
addNote(){
console.log(this.title);
console.log(this.currentMsg);
var obj = {
title:this.title,
content:this.currentMsg
}
this.lists.push(obj);
this.title = '';
this.msg = '';
}
},
// get方法
computed:{
currentMsg(){
return Marked(this.msg)
}
}
}
</script>
<style scoped="">
/*两个盒子布局*/
.marked {
float: left;
50%;
height: 500px;
}
.show {
float: right;
50%;
height: 500px;
}
</style>