• 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{
    	 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{
    	 100%;
    }
    .edit-area,.shower{
    	float: left;
    	 50%;
    }
    .edit-area textarea{
    	max- 80%;
    	min- 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
     console.log("hello"); 
    ```';
    
    
    
        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
    =======
    
    Sub-heading
    -----------
     
    ### Another deeper heading
     
    Paragraphs are separated
    by a blank line.
    
    Leave 2 spaces at the end of a line to do a  
    line break
    
    Text attributes *italic*, **bold**, 
    `monospace`, ~~strikethrough~~ .
    
    Shopping list:
    
      * apples
      * oranges
      * pears
    
    Numbered list:
    
      1. apples
      2. oranges
      3. pears
    
    The rain---not the reign---in
    Spain.
    
     *[Herman Fassett](https://freecodecamp.com/hermanfassett)*
    ```javascript
    function(){
      alert(hehe);
    }
    ```"
    
    
    
    
            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')
            );
    

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

  • 相关阅读:
    IO和序列化
    委托与事件
    [基础不过关填坑] 跨iframe触发事件
    有哪些新手程序员不知道的小技巧?
    给echarts加个“全屏展示”
    bootstrapTable使用场景及方式
    bootstrap datetimepicker 格式化yyyymmdd时,无法读取yyyymmdd格式
    【变态需求】bootstrapTable列排序-选择正序倒序不排序
    myeclipse、maven、tomcat、jdk技巧和坑【待完善】
    【调试技巧】 Fiddler高级用法之url映射请求
  • 原文地址:https://www.cnblogs.com/djtao/p/6227227.html
Copyright © 2020-2023  润新知