在之前的React官网教程中,提到了用Remarkable为插件的markdown评论框。现在就来正儿八经地用另外一个插件marked.js做一个markdown编辑器吧!

准备工作

或许在做之前,应该布个局。

  1. <div class="brand">
  2. <h1>Markdown Previewer</h1>
  3. </div>
  4. <div id=container>
  5. <div id="markdownApp">
  6. <div class="edit-area">
  7. <textarea placeholder="请输入markdown文本" class="editor"></textarea>
  8. </div>
  9. <div class="shower">
  10. </div>
  11. </div>
  12. </div>
  1. /*simple css-reset*/
  2. *{
  3. margin: 0;
  4. padding: 0;
  5. }
  6. ul{
  7. list-style: none;
  8. }
  9. a{
  10. text-decoration: none;
  11. }
  12. /*major*/
  13. .brand{
  14. width: 100%;
  15. height: 80px;
  16. background: rgb(21,127,178);
  17. }
  18. .brand h1{
  19. text-align: center;
  20. font-size: 30px;
  21. color: #fff;
  22. line-height: 80px;
  23. font-weight: normal;
  24. }
  25. #markdownApp{
  26. width: 100%;
  27. }
  28. .edit-area,.shower{
  29. float: left;
  30. width: 50%;
  31. }
  32. .edit-area textarea{
  33. max-width: 80%;
  34. min-width: 80%;
  35. margin: 20px;
  36. min-height:600px;
  37. border: 1px solid rgb(21,127,178)
  38. }

大概这样就OK了。

本demo使用的是以下环境(marked.js,highlight.js及其样式库)。

  1. <link rel="stylesheet" type="text/css" href="css/css.css"/>
  2. <link rel="stylesheet" href="css/bootstrap.min.css">
  3. <!-- 高亮样式库,为了让样式总体好看,使用bootstrap的样式库 -->
  4. <script src="js/react.js"></script>
  5. <script src="js/react-dom.js"></script>
  6. <script src="js/browser.min.js"></script>
  7. <script src="js/marked.js"></script>
  8. <script src="js/highlight.pack.js"></script>
  9. <script >hljs.initHighlightingOnLoad();</script>
  10. <script src="js/js.js"></script>

关于marked.js的设置用法参见marked.js简明手册

基本实现

基本上就是keyUp事件:

  1. var rendererMD = new marked.Renderer();
  2. marked.setOptions({
  3. renderer: rendererMD,
  4. highlight: function (code) {
  5. return hljs.highlightAuto(code).value;
  6. },
  7. gfm: true,
  8. tables: true,
  9. breaks: false,
  10. pedantic: false,
  11. sanitize: false,
  12. smartLists: true,
  13. smartypants: false
  14. });
  15. var markdownString = '```js\n console.log("hello"); \n```';
  16. var oEditor=document.getElementById('editor');
  17. var oShower=document.getElementById('shower');
  18. //oShower.innerHTML=marked(markdownString)
  19. oEditor.onkeyup=function(){
  20. oShower.innerHTML = marked(this.value);
  21. }

React思路

静态结构

按照html结构先把静态结构写上去:

  1. var MarkdownApp=React.createClass({
  2. render:function(){
  3. return (
  4. <div id="markdownApp">
  5. <Editor />
  6. <div className="shower" id="shower"></div>
  7. </div>
  8. );
  9. }
  10. });
  11. var Editor=React.createClass({
  12. render:function(){
  13. return (
  14. <div className="edit-area">
  15. <textarea placeholder="请输入markdown文本" id="editor" className="editor"></textarea>
  16. </div>
  17. );
  18. }
  19. });
  20. ReactDOM.render(
  21. <MarkdownApp/>,
  22. document.getElementById('container')
  23. )

动态实现

  1. 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```"
  2. var MarkdownApp=React.createClass({
  3. getInitialState:function(){
  4. return {
  5. content:str,
  6. }
  7. },
  8. handleChange:function(value){
  9. this.setState({
  10. content:value,
  11. });
  12. },
  13. render:function(){
  14. return (
  15. <div id="markdownApp">
  16. <Editor
  17. handleChange={(value)=>this.handleChange(value)}
  18. value={this.state.content}/>
  19. <Shower content={this.state.content} />
  20. </div>
  21. );
  22. }
  23. });
  24. var Editor=React.createClass({
  25. handleChange:function(e){
  26. var _this=e.target;
  27. this.props.handleChange(_this.value);
  28. },
  29. render:function(){
  30. return (
  31. <div className="edit-area">
  32. <textarea
  33. placeholder="请输入markdown文本"
  34. id="editor"
  35. className="editor"
  36. value={this.props.value}
  37. onChange={this.handleChange}>
  38. </textarea>
  39. </div>
  40. );
  41. }
  42. });
  43. var Shower=React.createClass({
  44. convertor:function(content){
  45. var rendererMD = new marked.Renderer();
  46. marked.setOptions({
  47. renderer: rendererMD,
  48. highlight: function (code) {
  49. return hljs.highlightAuto(code).value;
  50. },
  51. gfm: true,
  52. tables: true,
  53. breaks: true,
  54. pedantic: false,
  55. sanitize: true,
  56. smartLists: true,
  57. smartypants: false
  58. });
  59. //console.log(marked(content));
  60. return ({
  61. __html:marked(content)
  62. });//注意是两个下划线!
  63. },
  64. render:function(){
  65. return (
  66. <div
  67. className="shower"
  68. id="shower"
  69. dangerouslySetInnerHTML={this.convertor(this.props.content)}></div>
  70. );
  71. }
  72. });
  73. ReactDOM.render(
  74. <MarkdownApp/>,
  75. document.getElementById('container')
  76. );

看了一下,确实不用怎么想。

React项目(一):markdown编辑器的更多相关文章

  1. thinkphp5使用Markdown编辑器Editor.md并上传图片

    Editor.md官网:https://pandao.github.io/editor.md/index.html 下载后解压放到项目内,和引入ueditor差不多 1.引入项目资源 <!--m ...

  2. Yii2项目实现Markdown功能 在线Markdown编辑器

    版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处. Yii中添加MarkDown编辑器 主要使用了两个网页Markdown编辑器,都带预览功能. 1,ijackua/yii2-lepture ...

  3. JAVA WEB项目中使用并改造editor.md实现Markdown编辑器

    Markdown和Editor.md简介 Markdwon编辑器在技术工作者圈子中已经越来越流行,简单的语法,统一的格式,强大的扩展功能,最重要的是:你可以用Markdown,设计一篇精彩绝伦的文档而 ...

  4. 这可能就是你苦苦寻找免费、高颜值、功能强大的 Markdown 编辑器(共5款)

    本文作者 | HelloGitHub-小猪蹄 Markdown 是一个轻量级的标记语言,语法简单.容易上手,它深受程序员.博客主等人群的钟爱.随着越来越多的博客系统支持 Markdown,它也开始越来 ...

  5. 基于Java和Bytemd用120行代码实现一个桌面版Markdown编辑器

    前提 某一天点开掘金的写作界面的时候,发现了内置Markdown编辑器有一个Github的图标,点进去就是一个开源的Markdown编辑器项目bytemd(https://github.com/byt ...

  6. 任由文字肆意流淌,更自由的开源 Markdown 编辑器

    对于创作平台来说内容编辑器是十分重要的功能,强大的编辑器可以让创作者专注于创作"笔"下生花.而最好取悦程序员创作者的方法之一就是支持 Markdown 写作,因为大多数程序员都是用 ...

  7. 好用的Markdown编辑器一览 readme.md 编辑查看

    https://github.com/pandao/editor.md https://pandao.github.io/editor.md/examples/index.html Editor.md ...

  8. NanUI for Winform 使用示例【第二集】——做一个所见即所得的Markdown编辑器

    经过了这一个多星期的调整与修复,NanUI for .NET Winform的稳定版已经发布.应广大群友的要求,现已将NanUI的全部代码开源. GitHub: https://github.com/ ...

  9. 使用Markdown编辑器写博客

    使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图 ...

随机推荐

  1. javaScript对象-基本包装类型的详解

    本人按书上的内容大致地把javaScript对象划分成“引用类型”.“基本包装类型”和“内置对象”三块内容. 我们这篇先了解下基本包装类型的详细用法吧! 一.我们先解下相关概念: 1.引用类型的值(对 ...

  2. win2003 Enterprise x64 Edtion中的DCOM服务找不到WORD应用程序

    打开注册表,找到以下健值 HKEY_CLASSES_ROOT\AppID\{00020906-0000-0000-C000-000000000046} HKEY_CLASSES_ROOT\CLSID\ ...

  3. J2EE或MyEclipse简单配置以及第一个web页面

    首先打开你下载安装好的MyEclipse,配置你开发需要的环境. 大致分为3步:①配置编码:Window-->preferences-->General-->Workspace--& ...

  4. MySQL同步常见问题解答(自己的小心得)

    前几天刚刚注册了博客园,我想写一些技巧性的教程,今天给大家分享一个MySQL同步常见问题解答. Q:如果主服务器正在运行并且不想停止主服务器,怎样配置一个从服务器? A:有多种方法.如果你在某时间点做 ...

  5. redis 缓存技术与memcache的区别

    1 什么是redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset( ...

  6. Mellanox 8亿美元收购EZchip

    http://www.iccsz.com/site/cn/News/2015/10/08/20151008003916131771.htm Mellanox 8亿美元收购EZchip 目标电信运营商 ...

  7. 第9章 Shell基础(4)_Bash的运算符及环境变量配置文件

    5. Bash的运算符 5.1 数值运算与运算符 5.1.1 declare 声明变量类型:#declare [+/-] [选项] 变量名 选项 说明 - 给变量设定类型属性 + 取消变量的类型属性 ...

  8. 010商城项目:商品类目的选择——Dao,Service.Action层的分析

    我们现在开始写商品类选择这个功能: 先看效果: 当我们点击"新增商品"---->"选择目录"然后从数据库中查出来数据并显示了. 我们分析数据库的那张表: ...

  9. ActiveMQ笔记(1):编译、安装、示例代码

    一.编译 虽然ActiveMQ提供了发布版本,但是建议同学们自己下载源代码编译,以后万一有坑,还可以尝试自己改改源码. 1.1 https://github.com/apache/activemq/r ...

  10. [LeetCode] Max Sum of Rectangle No Larger Than K 最大矩阵和不超过K

    Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix s ...