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简洁的语法 代码块高亮 图片链接和图 ...
随机推荐
- MySQL可视化软件Work Bench导出导入数据库
首先打开你的work bench,输入你的密码进入主页面 A:导入数据库 在Schemas空白处右键选择Create~:建立一个数据库,然后就可以导入你的sql文件了 File-->Open S ...
- Solr实战:使用Hue+Solr实现标签查询
公司最近在研究多条件组合查询方案,Google的一位技术专家Sam和我们讨论了几个备选方案. Sam的信: 我做了进一步研究,目前有这么几种做法: 1) 最直接粗暴,只做一个主index,比如按行业+ ...
- FE
<link rel="stylesheet" type="text/css" media="screen" href="li ...
- [django]django 在apache2上部署静态文件如何加载
首先找到apache2的conf文件下的httpd.conf,添加如下信息: Alias /static/ E:/wamp/Apache24/www/static/ <Directory E:/ ...
- jquery ajax在跨域访问post请求的时候,ie9以下无效(包括ie9)
1. 设置浏览器安全属性,启用[通过域访问数据源]选项,如图:
- struts2+hibernate整合-实现登录功能
最近一直学习struts2+hibernate框架,于是想把两个框架整合到一起,做一个小的登录项目.其他不多说,直接看例子. 1).Struts2 和hibernate的环境配置 包括jar包.web ...
- CANopen学习——协议栈
协议,是双方都提前商量好的通讯约定. 例如:发送1代表灯亮,发送0代表灯灭. 但由于只是单bit的0和1在通信时,抗干扰太弱,且多种控制时不能区分,此时扩展一下协议. 例如: 头 地址 ...
- java 多线程 Synchronized方法和方法块 synchronized(this)和synchronized(object)的理解
synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法:通过在方法声明中加入 synchronized ...
- [LeetCode] Surrounded Regions 包围区域
Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...
- VS2015 使用及插件推荐
环境搭建与插件推荐 Cpp in Win10 x64 vs2015 + Resharper/Visual Assist X vs2015Pro: Download or see BaiDu 中文专 ...