1. 程式人生 > >從零一起學react(6)---props屬性驗證v16.0.0

從零一起學react(6)---props屬性驗證v16.0.0

前言

在之前使用過React.PropTypes.string.isRequired,但是出錯了,現在原因找到了,原來官網已經註明了:

注意: React.PropTypes 自 React v15.5 起已棄用。請使用 prop-types 庫代替。

所以需要引入 prop-types 庫,如下:

import PropTypes from 'prop-types'; //ES6
//
//我們之前一直使用的是<script>標籤引入,可引入如下標籤
<script src="https://unpkg.com/prop-types/prop-types.js">
</script> //或者 <script src="https://unpkg.com/prop-types/prop-types.min.js"></script>

簡單使用

下面我們可以先敲一個例子。

class Hello extends React.Component {
  render() {
    return <h1>{this.props.message}</h1>;
  }
}
Hello.propTypes = {
  message: PropTypes.string
};
var data="hello";
// var data = 11;
ReactDOM.render( <Hello message={data}/>, document.getElementById('test') );

這個例子在message為string型別時,沒有問題,當message為其他型別(如number)時,控制檯會產生如下warning。

Warning: Failed prop type: Invalid prop message of type number supplied to Hello, expected string.

我們還可以在後面加上isRequired如下:

Hello.propTypes
= { message: PropTypes.string.isRequired }

這樣的話,如果該元件沒有提供message屬性,會列印警告資訊。而前面的例子中,沒有message屬性並不會列印警告。

Warning: Failed prop type: The prop message is marked as required in Hello, but its value is undefined.

所有驗證器

下面是react官網所有的驗證器的例子:

MyComponent.propTypes = {
  // 你可以將屬性宣告為以下 JS 原生型別
  optionalArray: PropTypes.array,
  optionalBool: PropTypes.bool,
  optionalFunc: PropTypes.func,
  optionalNumber: PropTypes.number,
  optionalObject: PropTypes.object,
  optionalString: PropTypes.string,
  optionalSymbol: PropTypes.symbol,
  //
  // 任何可被渲染的元素(包括數字、字串、子元素或陣列)。
  optionalNode: PropTypes.node,
  //
  // 一個 React 元素
  optionalElement: PropTypes.element,
  //
  // 你也可以宣告屬性為某個類的例項,這裡使用 JS 的
  // instanceof 操作符實現。
  optionalMessage: PropTypes.instanceOf(Message),
  //
  // 你也可以限制你的屬性值是某個特定值之一
  optionalEnum: PropTypes.oneOf(['News', 'Photos']),
  //
  // 限制它為列舉型別之一的物件
  optionalUnion: PropTypes.oneOfType([
    PropTypes.string,
    PropTypes.number,
    PropTypes.instanceOf(Message)
  ]),
  //
  // 一個指定元素型別的陣列
  optionalArrayOf: PropTypes.arrayOf(PropTypes.number),
  //
  // 一個指定型別的物件
  optionalObjectOf: PropTypes.objectOf(PropTypes.number),
  //
  // 一個指定屬性及其型別的物件
  optionalObjectWithShape: PropTypes.shape({
    color: PropTypes.string,
    fontSize: PropTypes.number
  }),
  //
  // 你也可以在任何 PropTypes 屬性後面加上 `isRequired` 
  // 字尾,這樣如果這個屬性父元件沒有提供時,會列印警告資訊
  requiredFunc: PropTypes.func.isRequired,
  //
  // 任意型別的資料
  requiredAny: PropTypes.any.isRequired,
  //
  // 你也可以指定一個自定義驗證器。它應該在驗證失敗時返回
  // 一個 Error 物件而不是 `console.warn` 或丟擲異常。
  // 不過在 `oneOfType` 中它不起作用。
  customProp: function(props, propName, componentName) {
    if (!/matchme/.test(props[propName])) {
      return new Error(
        'Invalid prop `' + propName + '` supplied to' +
        ' `' + componentName + '`. Validation failed.'
      );
    }
  },
  //
  // 不過你可以提供一個自定義的 `arrayOf` 或 `objectOf` 
  // 驗證器,它應該在驗證失敗時返回一個 Error 物件。 它被用
  // 於驗證陣列或物件的每個值。驗證器前兩個引數的第一個是陣列
  // 或物件本身,第二個是它們對應的鍵。
  customArrayProp: PropTypes.arrayOf(function(propValue, key, componentName, location, propFullName) {
    if (!/matchme/.test(propValue[key])) {
      return new Error(
        'Invalid prop `' + propFullName + '` supplied to' +
        ' `' + componentName + '`. Validation failed.'
      );
    }
  })
};

相關推薦

一起react(6)---props屬性驗證v16.0.0

前言 在之前使用過React.PropTypes.string.isRequired,但是出錯了,現在原因找到了,原來官網已經註明了: 注意: React.PropTypes 自 React v15.5 起已棄用。請使用 prop-types 庫代替。

一起Spring Boot之LayIM項目長成記(一) 初見 Spring Boot

部分 基礎 依賴 com stat boot.s 情況下 比較 tar 項目背景   之前寫過LayIM的.NET版後端實現,後來又寫過一版Java的。當時用的是servlet,websocket和jdbc。雖然時間過去很久了,但是仍有些同學在關註。偶然間我聽說了Sprin

一起Spring Boot之LayIM項目長成記(六)單聊群聊的實現

href 宣傳 net 放棄 blog 群聊 項目 get 實現 文章傳送門:   https://my.oschina.net/panzi1/blog/1577007 並沒有放棄博客園,只是 t-io 在 oschina發展。用了人家的框架,也得幫人家做做宣傳是吧~~從零

開始PowerShell(6) 獲取物件資訊

在程式設計世界裡,我們一定聽說過面向物件思維,根據面向物件思維我們可以抽象的把現實世界中每一個事物都看成是一個物件,每個物件都包含自己特有的屬性和方法。 而在PowerShell中任何東西也都是一種物件,我們知道物件含有它的屬性和方法等資訊。當我們在編寫指令碼

開始React Native App開發

   學習更詳細資訊參考連結 通往全棧工程師的捷徑 —— React http://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=401107957&idx=1&sn=200418877771f656c1a0ab33ad407516&

[Wondgirl]開始React Native之ES5 ES6語法對比(七)

模組 引用 在ES5裡,如果使用CommonJS標準,引入React包基本通過require進行,程式碼類似這樣: //ES5 var React = require("react-native"); var { Image, Te

Asp.Net開始6

                    CheckBoxList繫結資料庫 資料庫連線累DB.CSusing System;using System.Data.SqlClient;namespace Test2_1{  public class DB {    public

[Wondgirl]開始React Native之Text(五)

像不像iOS的富文字 <Text style={{color:'#00F'}}> 我的文字 </Text>

一起koa2(5)---koa-bodyparser中介軟體

上一篇中寫了如何直接編寫程式碼接收並解析POST請求,比較麻煩,這種比較麻煩的事情一定有中介軟體讓我們使用,koa-bodyparser就是一個。對於POST請求的處理,koa-bodyparser中介軟體可以把koa2上下文的formData資料解析到ctx.

[Wondgirl]開始React Native之View(四)

index.ios.js如下: /** * Sample React Native App * https://github.com/facebook/react-native * @flo

開始大數據-Java基礎-switch語句(6

大數據 Java CCIE 從零開始學大數據 我們從零開始學習大數據技術,從java基礎,到Linux技術涉獵,再深入到大數據技術的Hadoop、Spark、Storm技術,最後到大數據企業平臺的搭建,層層遞進,由點到面!希望技術大牛能過來指導學習。上一節學習了流程控制語句,本節學習switc

開始 Web 之 jQuery(二)獲取和操作元素的屬性

eight images idt 隱藏 lis 屬性 ner master lin 大家好,這裏是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公眾號:Web前端之巔

開始 Web 之 HTML5(二)表單,多媒體新增內容,新增獲取操作元素,自定義屬性

器) user 對比 style 按鈕 ont mp3 url -- 大家好,這裏是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公眾號:Web前端之巔 博客園:ht

開始日文】#6 簡單文型:「請問那個是..」日語基礎文型教學

❶これはAです(這是A) ❷これはAのBです(這是A的B) ❸このAはBのです(這個A是B的) 具體發音請觀看Youtube https://www.youtube.com/watch?v=yDuH4pjWtXM&list=PLuNucubP18snvU3Zz8

開始Android自定義View之動畫系列——屬性動畫(3)

屬性動畫對補間動畫進行了很大幅度的改進,之前補間動畫可以做到的屬性動畫也能做到,補間動畫做不到的現在屬性動畫也可以做到了。因此,今天我們就來學習一下屬性動畫的高階用法,看看如何實現一些補間動畫所無法實現的功能。 ValueAnimator的高階用法 補間

51. spring boot屬性檔案之多環境配置【開始Spring Boot】(

【視訊&交流平臺】 http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=40000000

開始 Web 之 DOM(三)innerText與innerHTML、自定義屬性

大家好,這裡是「 Daotin的夢囈 」從零開始學 Web 系列教程。此文首發於「 Daotin的夢囈 」公眾號,歡迎大家訂閱關注。在這裡我會從 Web 前端零基礎開始,一步步學習 Web 相關的知識點,期間也會分享一些好玩的專案。現在就讓我們一起進入 Web 前端學習的冒險之旅吧! 一、相容程式碼 1

開始 Web 之 CSS3(三)漸變,background屬性

一、漸變 漸變是CSS3當中比較豐富多彩的一個特性,通過漸變我們可以實現許多炫麗的效果,有效的減少圖片的使用數量,並且具有很強的適應性和可擴充套件性。可分為線性漸變、徑向漸變。 1、線性漸變 線性漸變:指沿著某條直線朝一個方向產生漸變效果。 語法: background: linear-gradient(

開始 Web 之 CSS(五)可見性、內容移除、精靈圖、屬性選擇器、滑動門

大家好,這裡是「 Daotin的夢囈 」從零開始學 Web 系列教程。此文首發於「 Daotin的夢囈 」公眾號,歡迎大家訂閱關注。在這裡我會從 Web 前端零基礎開始,一步步學習 Web 相關的知識點,期間也會分享一些好玩的專案。現在就讓我們一起進入 Web 前端學習的冒險之旅吧! 一、CSS可見性