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,
}

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" />


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.


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;

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.


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.


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


4

Untuk prop tipe fungsi Anda dapat menggunakan kode berikut:

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

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

2

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

export default ({ children, id="menu", side="left", image={menu} }) => {
  ...
};

0
class Example extends React.Component {
  render() {
    return <h1>{this.props.text}</h1>;
  }
}

Example.defaultProps = { text: 'yo' }; 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.