Cara mengatur alat peraga standar komponen pada komponen Bereaksi

135

Saya menggunakan kode di bawah ini untuk mengatur alat peraga standar pada komponen Bereaksi tetapi tidak berfungsi. Dalam render()metode ini, saya dapat melihat output "props tidak terdefinisi" dicetak pada konsol browser. Bagaimana saya bisa menentukan nilai default untuk alat peraga komponen?

export default class AddAddressComponent extends Component {

render() {
   let {provinceList,cityList} = this.props
    if(cityList === undefined || provinceList === undefined){
      console.log('undefined props')
    }
    ...
}

AddAddressComponent.contextTypes = {
  router: React.PropTypes.object.isRequired
}

AddAddressComponent.defaultProps = {
  cityList: [],
  provinceList: [],
}

AddAddressComponent.propTypes = {
  userInfo: React.PropTypes.object,
  cityList: PropTypes.array.isRequired,
  provinceList: PropTypes.array.isRequired,
}
Joey Yi Zhao
sumber

Jawaban:

139

Anda lupa menutup Classbraket.

class AddAddressComponent extends React.Component {
  render() {
    let {provinceList,cityList} = this.props
    if(cityList === undefined || provinceList === undefined){
      console.log('undefined props')
    } else {
      console.log('defined props')
    }

    return (
      <div>rendered</div>
    )
  }
}

AddAddressComponent.contextTypes = {
  router: React.PropTypes.object.isRequired
};

AddAddressComponent.defaultProps = {
  cityList: [],
  provinceList: [],
};

AddAddressComponent.propTypes = {
  userInfo: React.PropTypes.object,
  cityList: React.PropTypes.array.isRequired,
  provinceList: React.PropTypes.array.isRequired,
}

ReactDOM.render(
  <AddAddressComponent />,
  document.getElementById('app')
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app" />

Serhii Baraniuk
sumber
92

Bagi mereka yang menggunakan sesuatu seperti babel stage-2 atau transform-class-properties :

import React, { PropTypes, Component } from 'react';

export default class ExampleComponent extends Component {
   static contextTypes = {
      // some context types
   };

   static propTypes = {
      prop1: PropTypes.object
   };

   static defaultProps = {
      prop1: { foobar: 'foobar' }
   };

   ...

}

Memperbarui

Pada React v15.5, PropTypestelah dipindahkan dari Paket Bereaksi utama ( tautan ):

import PropTypes from 'prop-types';

Edit

Seperti yang ditunjukkan oleh @johndodo, staticproperti kelas sebenarnya bukan bagian dari spesifikasi ES7, tetapi saat ini hanya didukung oleh babel. Diperbarui untuk mencerminkan itu.

treyhakanson
sumber
terima kasih atas jawabannya, tetapi saya ingin belajar sedikit lebih banyak tentang hal itu jadi lihatlah react/ nativedoc dan tidak dapat menemukan mereka, di mana doc untuk itu?
farmcommand2
Saya tidak berpikir itu secara eksplisit dalam React docs, tetapi jika Anda memahami staticvariabel kelas apa itu masuk akal, jadi saya sarankan membaca tentang mereka di MDN . Pada dasarnya, sintaks dalam dokumentasi ini setara dengan ini karena keduanya menambahkan informasi tentang alat peraga ke kelas itu sendiri, bukan contoh individu.
treyhakanson
1
impor diubah menjadi: mengimpor PropTypes dari 'prop-types';
tibi
1
@treyhakanson Tautan MDN hanya berbicara tentang metode statis, bukan variabel. Saya tidak dapat menemukan referensi untuk variabel kelas statis, kecuali untuk Babel . Apakah ini properti ES7 yang diterima?
johndodo
15

Pertama, Anda perlu memisahkan kelas Anda dari ekstensi selanjutnya yang tidak dapat Anda perpanjang di AddAddressComponent.defaultPropsdalam, classalih - alih pindahkan ke luar.

Saya juga akan merekomendasikan Anda untuk membaca tentang siklus hidup Konstruktor dan Bereaksi: lihat Komponen Komponen dan Siklus Hidup

Inilah yang Anda inginkan:

import PropTypes from 'prop-types';

class AddAddressComponent extends React.Component {
  render() {
    let { provinceList, cityList } = this.props;
    if(cityList === undefined || provinceList === undefined){
      console.log('undefined props');
    }
  }
}

AddAddressComponent.contextTypes = {
  router: PropTypes.object.isRequired
};

AddAddressComponent.defaultProps = {
  cityList: [],
  provinceList: [],
};

AddAddressComponent.propTypes = {
  userInfo: PropTypes.object,
  cityList: PropTypes.array.isRequired,
  provinceList: PropTypes.array.isRequired,
}

export default AddAddressComponent;
Ilanus
sumber
Apakah Anda yakin mereka membutuhkan constructordan componentWillReceiveProps? Menurut saya OP hanya lupa tanda kurung tutup untuk deklarasi kelas mereka.
ivarni
@ivarni belum tentu tetapi penting dia memahami siklus hidup, konstruktor, dan ekstensi kelas. jadi dia akan tahu apa yang dia lakukan. jadi saya menambahkan beberapa tautan eksternal
Ilanus
2
Cukup adil, saya hanya berpikir mengatakan "Anda perlu" tidak sepenuhnya benar. Saya lebih suka mengatakan sesuatu di sepanjang baris "Anda dapat menambahkan metode ini untuk mengamati siklus hidup" . Jika tidak, jawaban yang bagus :)
ivarni
9

Anda juga dapat menggunakan tugas Destrukturisasi.

class AddAddressComponent extends React.Component {
  render() {

    const {
      province="insertDefaultValueHere1",
      city="insertDefaultValueHere2"
    } = this.props

    return (
      <div>{province}</div>
      <div>{city}</div>
    )
  }
}

Saya suka pendekatan ini karena Anda tidak perlu menulis banyak kode.

Sam Henderson
sumber
2
Masalah yang saya lihat di sini adalah Anda mungkin ingin menggunakan alat peraga standar dalam berbagai metode.
Gerard Brull
5

gunakan defaultProps statis seperti:

export default class AddAddressComponent extends Component {
    static defaultProps = {
        provinceList: [],
        cityList: []
    }

render() {
   let {provinceList,cityList} = this.props
    if(cityList === undefined || provinceList === undefined){
      console.log('undefined props')
    }
    ...
}

AddAddressComponent.contextTypes = {
  router: React.PropTypes.object.isRequired
}

AddAddressComponent.defaultProps = {
  cityList: [],
  provinceList: [],
}

AddAddressComponent.propTypes = {
  userInfo: React.PropTypes.object,
  cityList: PropTypes.array.isRequired,
  provinceList: PropTypes.array.isRequired,
}

Diambil dari: https://github.com/facebook/react-native/issues/1772

Jika Anda ingin memeriksa jenisnya, lihat bagaimana menggunakan PropTypes dalam jawaban treyhakanson atau Ilan Hasanov, atau tinjau banyak jawaban di tautan di atas.

Brandon Keith Biggs
sumber
4

Anda dapat mengatur alat peraga default menggunakan nama kelas seperti yang ditunjukkan di bawah ini.

class Greeting extends React.Component {
  render() {
    return (
      <h1>Hello, {this.props.name}</h1>
    );
  }
}

// Specifies the default values for props:
Greeting.defaultProps = {
  name: 'Stranger'
};

Anda dapat menggunakan cara Bereaksi yang direkomendasikan dari tautan ini untuk info lebih lanjut

Rohith Murali
sumber
4

Untuk prop tipe fungsi Anda dapat menggunakan kode berikut:

AddAddressComponent.defaultProps = {
    callBackHandler: () => {}
};

AddAddressComponent.propTypes = {
    callBackHandler: PropTypes.func,
};
Wolfack
sumber
2

Jika Anda menggunakan komponen fungsional, Anda dapat menentukan default dalam tugas penataan, seperti:

export default ({ children, id="menu", side="left", image={menu} }) => {
  ...
};
Brian Burns
sumber
0
class Example extends React.Component {
  render() {
    return <h1>{this.props.text}</h1>;
  }
}

Example.defaultProps = { text: 'yo' }; 
Lepkem
sumber