《React+Redux前端开发实战》—1.4.3 JSX的用法

举报
华章计算机 发表于 2019/07/24 23:23:49 2019/07/24
【摘要】 本节书摘来自华章计算机《React+Redux前端开发实战》一书中的第1章,第1.4.3节,作者是徐顺发.

1.4.3  JSX的用法

  在React中,可以使用花括号{}把JavaScript表达式放入其中运行,放入{}中的代码会被当作JavaScript代码进行处理。

  1.JSX嵌套

  定义标签时,最外层只允许有一个标签,例如:

  

  const MessageList = () =>(

   <div>

      <div>Hello React!</div>

        <ul>

         <li>List1</li>

              <li>List2</li>

              <li>List2</li>

        </ul>

   </div>

  )

  

  假如写成以下这样:

  

  const MessageList = () =>(

   <div>

      <div>Hello React!</div>

        <ul>

         <li>List1</li>

              <li>List2</li>

              <li>List2</li>

        </ul>

       </div>

     <div>

      ...

     </div>

  )

  

  进行程序后会报错,无法通过编译,控制台报错如图1.9所示。

 image.png

图1.9  Babel报错

注意:由于JSX的特性接近JavaScript而非HTML,所以ReactDOM使用小驼峰命名(camelVase)来定义属性名。例如,class应该写为className。

  2.属性表达式

  在传统写法中,属性这样写:

  

  <div id="test-id">…</div>

  

  JSX中也实现了同样的写法,比如:

  

  const element = <div id="test-id" className="test-class"></div>

                                                                              // 注意class写为className

  

  同时还支持JavaScript动态设置属性值,比如:

  

  // 注意class写为className

  const element = <div id={this.state.testId} className={this.state.testClass}> </div>;

  const element = <img src={user.avatarUrl}></img>;

  

  对于复杂情景,还可以直接在属性内运行一个JavaScript函数,把函数返回值赋值给属性,比如:

  

  const element = <img src={this.getImgUrl()}></img>;

  

  这样,每当状态改变时,返回值会被渲染到真实元素的属性中。

  3.注释

  JSX语法中的注释沿用JavaScript的注释方法,唯一需要注意的是,在一个组件的子元素位置使用注释需要用{}括起来。例如:

  

  class App extends React.Component {

    render() {

      return (

      <div>

        {/* 注释内容 */}

        <p>Hi, man</p>

      </div>

      )

    }

  }

  4.Boolean属性

  Boolean的属性值,JSX语法中默认为true。要识别为false就需要使用{},这类标签常出现在表单元素中,如disable、checked和readOnly等。例如:

  <checkbox checked />等价于<checkbox checked={true} />,但要让checked为false,必须这么写:<checkbox checked={false} />。

  5.条件判断

  在JavaScript中可以使用判断条件的真假来判断对DOM节点进行动态显示或选择性显示。通常,在HTML中处理这样的问题比较麻烦,但对于JavaScript而言则轻而易举,这给开发者带来了极大的方便。本书主要介绍3种条件判断,分别是三目运算符、逻辑与(&&)运算符和函数表达式。

  三目运算符示例:

  

  class App extends React.Component { 

    constructor(){

      super();

      this.state={

        visible: false

      }

    }

    render() {

      return (

      <div>

        {

          this.state.visible  <span>visible为真</span> : <span>visible为真</span>

        }

      </div>

      )

    }

  }

  ReactDOM.render(<App />, document.querySelector("#app"))

  代码运行结果如图1.10所示。

  逻辑与(&&)运算符示例:

  

  class App extends React.Component { 

    constructor(){

      super();

      this.state={

        visible: false

      }

    }

    render() {

      return (

      <div>

        {

         !this.state.visible && <span>visible为真</span>

        }

      </div>

      )

    }

  }

  ReactDOM.render(<App />, document.querySelector("#app"))

  

  代码运行结果,如图1.11所示。

             image.png

       图1.10  三目运算符示例显示文本       图1.11  逻辑与(&&)运算符示例显示文本

  函数表达式示例:

  style样式:

  

  .red{

    color: red;

  }

  .blue{

    color: blue;

  }

  

  JSX:用JSX语法定义一个名为App的组件,用于在页面中渲染一个div节点。

  

  class App extends React.Component { 

    constructor(){

      super();

      this.state={

        isRed: true

      }

    }

   

    getClassName(){

   return this.state.isRed"red":"blue"

    }

   

    render() {

      return (

      <div className={this.getClassName()}>

        Hello React!

      </div>

      )

    }

  }

  ReactDOM.render(<App />, document.querySelector("#app"))

  

  运行代码,显示效果如图1.12所示。

image.png

  6.非DOM属性

  在React中还有几个特殊的属性是HTML所没有的:

  •  key(键);

  •  refs(引用);

  •  dangerouslySetInnerHTML。

  下面简单介绍它们的作用。

  (1)key(键):是一个可选的唯一标识符。比如有一组列表,当对它们进行增加或删除操作时,会导致列表重新渲染。当这组列表属性中拥有一个独一无二的key属性值之后就可以高性能地渲染页面。后面6.1节的diff算法中会详细分析该属性。示例用法如下:

  

  const todoItems = todos.map((todo) =>

    <li key={todo.id}>

      {todo.text}

    </li>

  );

  

  (2)refs(引用ref):任何组件都可以附加这个属性,该属性可以是字符串或回调函数。当refs是一个回调函数时,函数接收底层DOM元素或实例作为参数。这样就可以直接访问这个DOM或组件的节点了。但此时获取到的不是真实的DOM,而是React用来创建真实DOM的描述对象。写法如下:

  

  <input ref="myInput" />

  

  然后就可以通过this.refs.myInput去访问DOM或组件的节点了。

  refs适用的场景有处理焦点、文本选择、媒体控制、触发强制动画和集成第三方DOM库等。需要注意的是,官方并不推荐使用这个属性,除非“迫不得已”。

注意:无状态组件不支持ref。在React调用无状态组件之前没有实例化的过程,因此就没有所谓的ref。

  (3)dangerouslySetInnerHTML:这算是React中的一个冷知识,它接收一个对象,可以通过字符串形式的HTML来正常显示。

  

  <div dangerouslySetInnerHTML={{__html: '<span>First &middot;  Second </span>'}} />

  

  上面这段代码将在页面中显示First · Second。

  通过这种方式还可以避免cross-site scripting(XSS)攻击。这里不展开对XSS的介绍,读者可根据兴趣自行了解。

  7.样式属性

  样式(style)属性接收一个JavaScript对象,用于改变DOM的样式。

  JSX中的样式示例:

  let styles = {

   fontSize: "14px",

   color: "#red"

  }

  function AppComponent() {

   return <div style={styles}>Hello World!</div>

  }


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。