React项目(一):markdown编辑器
在之前的React官网教程中,提到了用Remarkable为插件的markdown评论框。现在就来正儿八经地用另外一个插件marked.js
做一个markdown编辑器吧!
准备工作
或许在做之前,应该布个局。
<div class="brand">
<h1>Markdown Previewer</h1>
</div>
<div id=container>
<div id="markdownApp">
<div class="edit-area">
<textarea placeholder="请输入markdown文本" class="editor"></textarea>
</div>
<div class="shower">
</div>
</div>
</div>
/*simple css-reset*/
*{
margin: 0;
padding: 0;
}
ul{
list-style: none;
}
a{
text-decoration: none;
}
/*major*/
.brand{
width: 100%;
height: 80px;
background: rgb(21,127,178);
}
.brand h1{
text-align: center;
font-size: 30px;
color: #fff;
line-height: 80px;
font-weight: normal;
}
#markdownApp{
width: 100%;
}
.edit-area,.shower{
float: left;
width: 50%;
}
.edit-area textarea{
max-width: 80%;
min-width: 80%;
margin: 20px;
min-height:600px;
border: 1px solid rgb(21,127,178)
}
大概这样就OK了。
本demo使用的是以下环境(marked.js,highlight.js及其样式库)。
<link rel="stylesheet" type="text/css" href="css/css.css"/>
<link rel="stylesheet" href="css/bootstrap.min.css">
<!-- 高亮样式库,为了让样式总体好看,使用bootstrap的样式库 -->
<script src="js/react.js"></script>
<script src="js/react-dom.js"></script>
<script src="js/browser.min.js"></script>
<script src="js/marked.js"></script>
<script src="js/highlight.pack.js"></script>
<script >hljs.initHighlightingOnLoad();</script>
<script src="js/js.js"></script>
关于marked.js的设置用法参见marked.js简明手册。
基本实现
基本上就是keyUp事件:
var rendererMD = new marked.Renderer();
marked.setOptions({
renderer: rendererMD,
highlight: function (code) {
return hljs.highlightAuto(code).value;
},
gfm: true,
tables: true,
breaks: false,
pedantic: false,
sanitize: false,
smartLists: true,
smartypants: false
});
var markdownString = '```js\n console.log("hello"); \n```';
var oEditor=document.getElementById('editor');
var oShower=document.getElementById('shower');
//oShower.innerHTML=marked(markdownString)
oEditor.onkeyup=function(){
oShower.innerHTML = marked(this.value);
}
React思路
静态结构
按照html结构先把静态结构写上去:
var MarkdownApp=React.createClass({
render:function(){
return (
<div id="markdownApp">
<Editor />
<div className="shower" id="shower"></div>
</div>
);
}
});
var Editor=React.createClass({
render:function(){
return (
<div className="edit-area">
<textarea placeholder="请输入markdown文本" id="editor" className="editor"></textarea>
</div>
);
}
});
ReactDOM.render(
<MarkdownApp/>,
document.getElementById('container')
)
动态实现
var str="Heading\n=======\n\nSub-heading\n-----------\n \n### Another deeper heading\n \nParagraphs are separated\nby a blank line.\n\nLeave 2 spaces at the end of a line to do a \nline break\n\nText attributes *italic*, **bold**, \n`monospace`, ~~strikethrough~~ .\n\nShopping list:\n\n * apples\n * oranges\n * pears\n\nNumbered list:\n\n 1. apples\n 2. oranges\n 3. pears\n\nThe rain---not the reign---in\nSpain.\n\n *[Herman Fassett](https://freecodecamp.com/hermanfassett)*\n```javascript\nfunction(){\n alert(hehe);\n}\n```"
var MarkdownApp=React.createClass({
getInitialState:function(){
return {
content:str,
}
},
handleChange:function(value){
this.setState({
content:value,
});
},
render:function(){
return (
<div id="markdownApp">
<Editor
handleChange={(value)=>this.handleChange(value)}
value={this.state.content}/>
<Shower content={this.state.content} />
</div>
);
}
});
var Editor=React.createClass({
handleChange:function(e){
var _this=e.target;
this.props.handleChange(_this.value);
},
render:function(){
return (
<div className="edit-area">
<textarea
placeholder="请输入markdown文本"
id="editor"
className="editor"
value={this.props.value}
onChange={this.handleChange}>
</textarea>
</div>
);
}
});
var Shower=React.createClass({
convertor:function(content){
var rendererMD = new marked.Renderer();
marked.setOptions({
renderer: rendererMD,
highlight: function (code) {
return hljs.highlightAuto(code).value;
},
gfm: true,
tables: true,
breaks: true,
pedantic: false,
sanitize: true,
smartLists: true,
smartypants: false
});
//console.log(marked(content));
return ({
__html:marked(content)
});//注意是两个下划线!
},
render:function(){
return (
<div
className="shower"
id="shower"
dangerouslySetInnerHTML={this.convertor(this.props.content)}></div>
);
}
});
ReactDOM.render(
<MarkdownApp/>,
document.getElementById('container')
);
看了一下,确实不用怎么想。
React项目(一):markdown编辑器的更多相关文章
- thinkphp5使用Markdown编辑器Editor.md并上传图片
Editor.md官网:https://pandao.github.io/editor.md/index.html 下载后解压放到项目内,和引入ueditor差不多 1.引入项目资源 <!--m ...
- Yii2项目实现Markdown功能 在线Markdown编辑器
版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处. Yii中添加MarkDown编辑器 主要使用了两个网页Markdown编辑器,都带预览功能. 1,ijackua/yii2-lepture ...
- JAVA WEB项目中使用并改造editor.md实现Markdown编辑器
Markdown和Editor.md简介 Markdwon编辑器在技术工作者圈子中已经越来越流行,简单的语法,统一的格式,强大的扩展功能,最重要的是:你可以用Markdown,设计一篇精彩绝伦的文档而 ...
- 这可能就是你苦苦寻找免费、高颜值、功能强大的 Markdown 编辑器(共5款)
本文作者 | HelloGitHub-小猪蹄 Markdown 是一个轻量级的标记语言,语法简单.容易上手,它深受程序员.博客主等人群的钟爱.随着越来越多的博客系统支持 Markdown,它也开始越来 ...
- 基于Java和Bytemd用120行代码实现一个桌面版Markdown编辑器
前提 某一天点开掘金的写作界面的时候,发现了内置Markdown编辑器有一个Github的图标,点进去就是一个开源的Markdown编辑器项目bytemd(https://github.com/byt ...
- 任由文字肆意流淌,更自由的开源 Markdown 编辑器
对于创作平台来说内容编辑器是十分重要的功能,强大的编辑器可以让创作者专注于创作"笔"下生花.而最好取悦程序员创作者的方法之一就是支持 Markdown 写作,因为大多数程序员都是用 ...
- 好用的Markdown编辑器一览 readme.md 编辑查看
https://github.com/pandao/editor.md https://pandao.github.io/editor.md/examples/index.html Editor.md ...
- NanUI for Winform 使用示例【第二集】——做一个所见即所得的Markdown编辑器
经过了这一个多星期的调整与修复,NanUI for .NET Winform的稳定版已经发布.应广大群友的要求,现已将NanUI的全部代码开源. GitHub: https://github.com/ ...
- 使用Markdown编辑器写博客
使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图 ...
随机推荐
- 利用sphinx为python项目生成API文档
sphinx可以根据python的注释生成可以查找的api文档,简单记录了下步骤 1:安装 pip install -U Sphinx 2:在需要生成文档的.py文件目录下执行sphinx-apido ...
- 关于Oracle表连接
表连接注意left join on与where的区别: select * from dept; select * from emp; select * from emp a right outer j ...
- 用css改变默认的checkbox样式
自己常用的改变checkbox样式的两个方法: 一.利用background用图片代替checkbox效果 缺点:你首先得有一张好看的图片 优点:浏览器兼容性好 <!doctype html&g ...
- WPF DevExpress 设置雷达图Radar样式
DevExpress中定义的ChartControl很不错,很多项目直接使用这种控件. 本节讲述雷达图的样式设置 <Grid> <Grid.Resources> <D ...
- HDOJ 1008. Elevator 简单模拟水题
Elevator Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- fail树
前置技能:AC自动机 假设我们有了一个AC自动机,然后在上面进行字符串匹配. 上面是一个有四个字符串的AC自动机(abcde.aacdf.cdf.cde),虚线是fail指针,实线是转移. 这是上一次 ...
- 数据库 数据库SQL语句三
转换函数 to_char()字符串转换日期函数 --查询大于某个日期的员工信息 select * from emp where hiredate>to_date('1980-02-12','yy ...
- Nutch搜索引擎(第1期)_ Nutch简介及安装
1.Nutch简介 Nutch是一个由Java实现的,开放源代码(open-source)的web搜索引擎.主要用于收集网页数据,然后对其进行分析,建立索引,以提供相应的接口来对其网页数据进行查询的一 ...
- [LeetCode] Search for a Range 搜索一个范围
Given a sorted array of integers, find the starting and ending position of a given target value. You ...
- IT培训行业揭秘(五)
前面说了一大堆,简单揭露了一些目前培训行业鱼龙混在的情况,那么今天我就站在一个即将毕业的大学生角度来谈谈如何选择一个靠谱的培训机构. 你即将大学毕业了,在大学里面浑浑噩噩的混了几年,马上就要离开校园, ...