React Props


Perbezaan utama antara

keadaan dan prop ialah props tidak boleh diubah, manakala keadaan boleh berubah berdasarkan interaksi dengan pengguna. Inilah sebabnya mengapa sesetengah komponen kontena perlu menentukan keadaan untuk mengemas kini dan mengubah suai data. Subkomponen hanya boleh menghantar data melalui prop.


Menggunakan Props

Contoh berikut menunjukkan cara menggunakan prop dalam komponen:

Instance

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>php中文网 React 实例</title>
    <script src="http://static.php.cn/assets/react/react-0.14.7/build/react.min.js"></script>
    <script src="http://static.php.cn/assets/react/react-0.14.7/build/react-dom.min.js"></script>
    <script src="http://static.php.cn/assets/react/browser.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel">
      var HelloMessage = React.createClass({
        render: function() {
          return <h1>Hello {this.props.name}</h1>;
        }
      });

      ReactDOM.render(
        <HelloMessage name="php" />,
        document.getElementById('example')
      );
    </script>
  </body>
</html>

Jalankan instance»

Klik butang "Run instance" untuk melihat instance dalam talian

Atribut nama dalam instance diperolehi melalui this.props.name.


Props Lalai

Anda boleh menetapkan nilai lalai untuk prop melalui kaedah getDefaultProps() Contohnya adalah seperti berikut:

Contoh

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>php中文网 React 实例</title>
    <script src="http://static.php.cn/assets/react/react-0.14.7/build/react.min.js"></script>
    <script src="http://static.php.cn/assets/react/react-0.14.7/build/react-dom.min.js"></script>
    <script src="http://static.php.cn/assets/react/browser.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel">
      var HelloMessage = React.createClass({
      getDefaultProps: function() {
        return {
          name: 'php'
        };
      },
      render: function() {
        return <h1>Hello {this.props.name}</h1>;
      }
    });

    ReactDOM.render(
      <HelloMessage />,
      document.getElementById('example')
    );
    </script>
  </body>
</html>

Jalankan contoh»

Klik butang "Jalankan contoh" untuk melihat contoh dalam talian


Nyatakan dan Props

Contoh berikut Menunjukkan cara menggabungkan keadaan dan prop dalam aplikasi anda. Kita boleh menetapkan keadaan dalam komponen induk dan menyampaikannya kepada komponen anak menggunakan prop pada komponen anak. Dalam fungsi render, kami menetapkan nama dan tapak untuk mendapatkan data yang diluluskan oleh komponen induk.

Instance

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>php中文网 React 实例</title>
    <script src="http://static.php.cn/assets/react/react-0.14.7/build/react.min.js"></script>
    <script src="http://static.php.cn/assets/react/react-0.14.7/build/react-dom.min.js"></script>
    <script src="http://static.php.cn/assets/react/browser.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel">
    var WebSite = React.createClass({
      getInitialState: function() {
        return {
          name: "php中文网",
          site: "http://www.php.cn"
        };
      },
     
      render: function() {
        return (
          <div>
            <Name name={this.state.name} />
            <Link site={this.state.site} />
          </div>
        );
      }
    });

    var Name = React.createClass({
      render: function() {
        return (
          <h1>{this.props.name}</h1>
        );
      }
    });

    var Link = React.createClass({
      render: function() {
        return (
          <a href={this.props.site}>
            {this.props.site}
          </a>
        );
      }
    });

    React.render(
      <WebSite />,
      document.getElementById('example')
    );
    </script>
  </body>
</html>

Run Instance»

Klik butang "Run Instance" untuk melihat contoh dalam talian


Pengesahan prop

Pengesahan prop menggunakan propTypes, yang boleh memastikan bahawa komponen aplikasi kami digunakan dengan betul.PropTypes menyediakan banyak pengesah (validator) untuk mengesahkan yang masuk Sama ada data itu sah. Konsol JavaScript akan memberikan amaran apabila data tidak sah dihantar ke prop.

Contoh berikut mencipta komponen Tajuk saya Tajuk atribut diperlukan dan merupakan rentetan Jika nombor, ralat akan dilaporkan:

Contoh

<. 🎜>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>php中文网 React 实例</title>
    <script src="http://static.php.cn/assets/react/react-0.14.7/build/react.js"></script>
    <script src="http://static.php.cn/assets/react/react-0.14.7/build/react-dom.js"></script>
    <script src="http://static.php.cn/assets/react/browser.min.js"></script>
  </head>
  <body>
	  <div id="example"></div>
    <script type="text/babel">
    var title = "php中文网";
    // var title = 123;
    var MyTitle = React.createClass({
      propTypes: {
        title: React.PropTypes.string.isRequired,
      },

      render: function() {
         return <h1> {this.props.title} </h1>;
       }
    });
    ReactDOM.render(
        <MyTitle title={title} />,
        document.getElementById('example')
    );
    </script>
  </body>
</html>

Jalankan instance»Klik butang "Run instance" untuk melihat contoh dalam talian

Jika tajuk menggunakan pembolehubah angka, mesej ralat berikut akan muncul pada konsol:

Amaran: Gagal propType: Prop tidak sah `title` jenis `nombor` dibekalkan kepada `MyTitle`, jangkaan `string`.

Lebih banyak keterangan pengesah adalah seperti berikut:

React.createClass({
  propTypes: {
    // 可以声明 prop 为指定的 JS 基本数据类型,默认情况,这些数据是可选的
   optionalArray: React.PropTypes.array,
    optionalBool: React.PropTypes.bool,
    optionalFunc: React.PropTypes.func,
    optionalNumber: React.PropTypes.number,
    optionalObject: React.PropTypes.object,
    optionalString: React.PropTypes.string,

    // 可以被渲染的对象 numbers, strings, elements 或 array
    optionalNode: React.PropTypes.node,

    //  React 元素
    optionalElement: React.PropTypes.element,

    // 用 JS 的 instanceof 操作符声明 prop 为类的实例。
    optionalMessage: React.PropTypes.instanceOf(Message),

    // 用 enum 来限制 prop 只接受指定的值。
    optionalEnum: React.PropTypes.oneOf(['News', 'Photos']),

    // 可以是多个对象类型中的一个
    optionalUnion: React.PropTypes.oneOfType([
      React.PropTypes.string,
      React.PropTypes.number,
      React.PropTypes.instanceOf(Message)
    ]),

    // 指定类型组成的数组
    optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),

    // 指定类型的属性构成的对象
    optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number),

    // 特定 shape 参数的对象
    optionalObjectWithShape: React.PropTypes.shape({
      color: React.PropTypes.string,
      fontSize: React.PropTypes.number
    }),

    // 任意类型加上 `isRequired` 来使 prop 不可空。
    requiredFunc: React.PropTypes.func.isRequired,

    // 不可空的任意类型
    requiredAny: React.PropTypes.any.isRequired,

    // 自定义验证器。如果验证失败需要返回一个 Error 对象。不要直接使用 `console.warn` 或抛异常,因为这样 `oneOfType` 会失效。
    customProp: function(props, propName, componentName) {
      if (!/matchme/.test(props[propName])) {
        return new Error('Validation failed!');
      }
    }
  },
  /* ... */
});