Skip to content

属性 Props

用法

通过 Props 向子组件传递数据,比如:

tsx
import { Component, tag, render } from 'omi'

@tag('my-element')
class MyElement extends Component {
  render(props) {
    return (
      <h1>Hello, {props.name}!</h1>
    )
  }
}
import { Component, tag, render } from 'omi'

@tag('my-element')
class MyElement extends Component {
  render(props) {
    return (
      <h1>Hello, {props.name}!</h1>
    )
  }
}

使用元素:

tsx
<my-element name="world"></my-element>
<my-element name="world"></my-element>

你也可以传任意类型的数据给 props:

tsx
@tag('my-element')
class MyElement extends Component {
  render(props) {
    return (
      <h1>Hello, {props.myObj.name}!</h1>
    )
  }
}
@tag('my-element')
class MyElement extends Component {
  render(props) {
    return (
      <h1>Hello, {props.myObj.name}!</h1>
    )
  }
}

使用元素:

tsx
<my-element myObj={{ name: 'world' }}></my-element>
<my-element myObj={{ name: 'world' }}></my-element>

你可以通过静态属性 static defaultProps 来设置默认值,使用 static propTypes 来设置类型:

tsx
@tag('my-element')
class MyElement extends Component {
  static defaultProps = {
    name: 'Omi',
    myAge: 18
  }
  
  // 不是必须定义,当您使用 omi 单独写组件时候才需要定义 propTypes
  static propTypes = {
    name: String,
    myAge: Number,
    // 也支持多类型
    color: [String, Array]
  }

  render(props) {
    return (
      <h1>Hello, {props.name}! Age {props.myAge}</h1>
    )
  }
}
@tag('my-element')
class MyElement extends Component {
  static defaultProps = {
    name: 'Omi',
    myAge: 18
  }
  
  // 不是必须定义,当您使用 omi 单独写组件时候才需要定义 propTypes
  static propTypes = {
    name: String,
    myAge: Number,
    // 也支持多类型
    color: [String, Array]
  }

  render(props) {
    return (
      <h1>Hello, {props.name}! Age {props.myAge}</h1>
    )
  }
}

需要特别注意,如果你的自定义元素想要直接在其他框架或者无框架的情况下原生使用,请一定要加上 static propTypes 才能生效。比如,这样就可以直接在 body 中使用:

html
<body>
  <my-element name="dntzhang" my-age="20"></my-element>
</body>
<body>
  <my-element name="dntzhang" my-age="20"></my-element>
</body>

合并定义

如果不想单独定义,可以合并到 static props 一起定义,该定义也会合并已经存在的定义。

tsx
  static props = {
    count: {
      type: Number,
      default: 0,
      changed(newValue, oldValue) {
        this.state.count = newValue
        this.update()
      }
    }
  }
  static props = {
    count: {
      type: Number,
      default: 0,
      changed(newValue, oldValue) {
        this.state.count = newValue
        this.update()
      }
    }
  }

props 的 ts 类型定义如下:

ts
type PropType = String | Number | Boolean | Array<any> | Object | Array<PropType>;

type Props =  {
  [key: string]: {
    type?: PropType;
    default?: any;
    reflect?: boolean | ((value: any) => any);
    changed?: (newValue: any, oldValue: any) => void;
  }
}
type PropType = String | Number | Boolean | Array<any> | Object | Array<PropType>;

type Props =  {
  [key: string]: {
    type?: PropType;
    default?: any;
    reflect?: boolean | ((value: any) => any);
    changed?: (newValue: any, oldValue: any) => void;
  }
}