React.js 小书 Lesson23 - dangerouslySetHTML 和 style 属性


React.js 小书 Lesson23 - dangerouslySetHTML 和 style 属性

本文作者:胡子大哈
本文原文:http://huziketang.com/books/react/lesson23

转载请注明出处,保留原文链接以及作者信息

在线阅读:http://huziketang.com/books/react


{% raw %}
这一节我们来补充两个之前没有提到的属性,但是在 React.js 组件开发中也非常常用,但是它们也很简单。

dangerouslySetHTML

出于安全考虑的原因(XSS 攻击),在 React.js 当中所有的表达式插入的内容都会被自动转义,就相当于 jQuery 里面的 text(…) 函数一样,任何的 HTML 格式都会被转义掉:

class Editor extends Component {
  constructor() {
    super()
    this.state = {
      content: '<h1>React.js 小书</h1>'
    }
  }

  render () {
    return (
      <div className='editor-wrapper'>
        {this.state.content}
      </div>
    )
  }
}

假设上面是一个富文本编辑器组件,富文本编辑器的内容是动态的 HTML 内容,用 this.state.content 来保存。我希望在编辑器内部显示这个动态 HTML 结构,但是因为 React.js 的转义特性,页面上会显示:

[图片上传失败...(image-300cb3-1510226959693)]

表达式插入并不会把一个 <h1> 渲染到页面,而是把它的文本形式渲染了。那要怎么才能做到设置动态 HTML 结构的效果呢?React.js 提供了一个属性 dangerouslySetInnerHTML,可以让我们设置动态设置元素的 innerHTML:

...
  render () {
    return (
      <div
        className='editor-wrapper'
        dangerouslySetInnerHTML={{__html: this.state.content}} />
    )
  }
...

需要给 dangerouslySetInnerHTML 传入一个对象,这个对象的 __html 属性值就相当于元素的 innerHTML,这样我们就可以动态渲染元素的 innerHTML 结构了。

有写朋友会觉得很奇怪,为什么要把一件这么简单的事情搞得这么复杂,名字又长,还要传入一个奇怪的对象。那是因为设置 innerHTML 可能会导致跨站脚本攻击(XSS),所以 React.js 团队认为把事情搞复杂可以防止(警示)大家滥用这个属性。这个属性不必要的情况就不要使用。

style

React.js 中的元素的 style 属性的用法和 DOM 里面的 style 不大一样,普通的 HTML 中的:

<h1 style='font-size: 12px; color: red;'>React.js 小书</h1>

在 React.js 中你需要把 CSS 属性变成一个对象再传给元素:

<h1 style={{fontSize: '12px', color: 'red'}}>React.js 小书</h1>

style 接受一个对象,这个对象里面是这个元素的 CSS 属性键值对,原来 CSS 属性中带 - 的元素都必须要去掉 - 换成驼峰命名,如 font-size 换成 fontSizetext-align 换成 textAlign

用对象作为 style 方便我们动态设置元素的样式。我们可以用 props 或者 state 中的数据生成样式对象再传给元素,然后用 setState 就可以修改样式,非常灵活:

<h1 style={{fontSize: '12px', color: this.state.color}}>React.js 小书</h1>

只要简单地 setState({color: 'blue'}) 就可以修改元素的颜色成蓝色。
{% endraw %}

下一节中我们将介绍《React.js 小书 Lesson24 - PropTypes 和组件参数验证》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 14,680评论 1 92
  • 几个月来,第一次回顾那段感情,说是感情,其实于他,不过是套路的重复使用。于我,不过只是一场空欢喜。若用几字总结起来...
    无隐阅读 5,099评论 1 2
  • 自古最悲帝王家,父子相残,兄弟相杀的惨剧,几千年来,发生的不止一起两起。 太子兵败之后,参与作战和平叛的官员将领都...
    懒虫小狮子阅读 1,300评论 0 0
  • 一个星期前还在为选择哪一份工作而愁肠百结 今天就坐在家里悠闲地看起了电视 然后家里人帮我作了决定 可能人生就是这样...
    肖赞赞阅读 1,605评论 0 1
  • “奶奶,我走了,不然要迟到了。” “慢点,每天都这样,这孩子真不叫人省心。”老人家一脸的无奈。没办法,叹叹气也就进...
    雨木瞳目阅读 3,110评论 1 6