React和PropTypes

里扎德·博西亚克

前段时间,我尝试着在React中迈出第一步。现在,我正在尝试创建简单的待办事项列表应用程序。我的一位同事告诉我,将PropTypesshapearrayOf一起使用会很好我有一个将数据传递给另一个组件的组件,这是我的问题(List.jsListItem.js)。我不确定何时,何地以及如何使用带有shapearrayOf的propTypes哪种方法正确?在父组件或子组件中定义PropTypes也许有更好的主意?请在下面找到我的代码,如果您能向我说明如何使用PropTypes,那就太好了。我试图在Web中搜索某些内容,但还是没有得到。

App.js主文件:

import React from "react";
import "./styles/App.scss";
import List from "./components/List/List";
import AppHeader from "./components/AppHeader/AppHeader";

function App() {
  return (
    <div className="App">
      <AppHeader content="TODO List"></AppHeader>
      <List></List>
    </div>
  );
}

export default App;

AppHeader.js文件:

import React from "react";
import "./AppHeader.scss";

export default function AppHeader(props) {
  return (
    <div className="header">
      <h1 className="header-headline">{props.content}</h1>
    </div>
  );
}

List.js文件:

import React from "react";
import "./List.scss";
import ListItem from "../ListItem/ListItem";
import _ from "lodash";

const initialList = [
  { id: "a", name: "Water plants", status: "done" },
  { id: "b", name: "Buy something to eat", status: "in-progress" },
  { id: "c", name: "Book flight", status: "in-preparation" }
];

const inputId = _.uniqueId("form-input-");

// function component
const List = () => {
  const [value, setValue] = React.useState(""); // Hook
  const [list, setList] = React.useState(initialList); // Hook

  const handleChange = event => {
    setValue(event.target.value);
  };

  // add element to the list
  const handleSubmit = event => {
    // prevent to add empty list elements
    if (value) {
      setList(
        list.concat({ id: Date.now(), name: value, status: "in-preparation" })
      );
    }

    // clear input value after added new element to the list
    setValue("");

    event.preventDefault();
  };

  // remove current element from the list
  const removeListItem = id => {
    setList(list.filter(item => item.id !== id));
  };

  // adding status to current element of the list
  const setListItemStatus = (id, status) => {
    setList(
      list.map(item => (item.id === id ? { ...item, status: status } : item))
    );
  };

  return (
    <div className="to-do-list-wrapper">
      <form className="to-do-form" onSubmit={handleSubmit}>
        <label htmlFor={inputId} className="to-do-form-label">
          Type item name:
        </label>
        <input
          type="text"
          value={value}
          onChange={handleChange}
          className="to-do-form-input"
          id={inputId}
        />
        <button type="submit" className="button to-do-form-button">
          Add Item
        </button>
      </form>

      <ul className="to-do-list">
        {list.map(item => (
          <ListItem
            name={item.name}
            status={item.status}
            key={item.id}
            id={item.id}
            setListItemStatus={setListItemStatus}
            removeListItem={removeListItem}
          ></ListItem>
        ))}
      </ul>
    </div>
  );
};

export default List;

和ListItem.js文件:

import React from "react";
import PropTypes from "prop-types";
import "./ListItem.scss";

const ListItem = props => {
  return (
    <li className={"list-item " + props.status} key={props.id}>
      <span className="list-item-icon"></span>
      <div className="list-item-content-wrapper">
        <span className="list-item-text">{props.name}</span>
        <div className="list-item-button-wrapper">
          <button
            type="button"
            onClick={() => props.setListItemStatus(props.id, "in-preparation")}
            className="button list-item-button"
          >
            In preparation
          </button>
          <button
            type="button"
            onClick={() => props.setListItemStatus(props.id, "in-progress")}
            className="button list-item-button"
          >
            In progress
          </button>
          <button
            type="button"
            onClick={() => props.setListItemStatus(props.id, "done")}
            className="button list-item-button"
          >
            Done
          </button>
          <button
            type="button"
            onClick={() => props.removeListItem(props.id)}
            className="button list-item-button"
          >
            Remove
          </button>
        </div>
      </div>
    </li>
  );
};

ListItem.propTypes = {
  id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
  name: PropTypes.string,
  status: PropTypes.string,
  removeListItem: PropTypes.func,
  setListItemStatus: PropTypes.func
};

export default ListItem;
wentjun

我并不完全确定将在何处propTypesshapearrayOf使用,但通常,PropTypes当你试图呈现一个父组件内的子组件是有用的,而且要开展TypeChecking对相关子组件的道具。

在方案中,arrayOf并且shape可以在组件内的道具之一使用,由此支柱是特定类型(阵列arrayOf特定类型的对象(),和shape,或exact)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

跨共享组件的React js和PropTypes重复

来自分类Dev

let从'react / addons'导入React和从'react / addons'导入{PropTypes}之间的区别

来自分类Dev

let从'react / addons'导入React和从'react / addons'导入{PropTypes}之间的区别

来自分类Dev

提取/读取React propTypes

来自分类Dev

React PropTypes文件类型

来自分类Dev

区分 React propTypes

来自分类Dev

是否可以将propTypes和defaultProps作为静态prop放入React类中?

来自分类Dev

如何声明React PropTypes XOR

来自分类Dev

React PropTypes 与单元测试

来自分类Dev

PropTypes.exact和PropTypes.shape之间的区别

来自分类Dev

错误:升级后无法找到模块对象分配以响应 ^15.3 和 react-dom ^15.3 以获取 Proptypes 警告

来自分类Dev

propTypes isRequired约束react中的误导行为

来自分类Dev

如何通过Jest测试React PropTypes?

来自分类Dev

React PropTypes-以数字为键的形状

来自分类Dev

获取React组件的类型propTypes定义

来自分类Dev

没有类型的React Js PropTypes

来自分类Dev

React Proptypes-无状态组件

来自分类Dev

React中的Proptypes Number是否可以浮动?

来自分类Dev

React PropTypes检查错误的类型

来自分类Dev

Proptypes:验证接口数组作为props in react

来自分类Dev

获取React组件的类型propTypes定义

来自分类Dev

React PropTypes 导入类。道具类型无效

来自分类Dev

React.PropTypes.func.isRequired 的问题

来自分类Dev

React.PropTypes 自 React 15.5.0 起已弃用

来自分类Dev

在React组件中访问嵌套propTypes中的所有prop

来自分类Dev

React Proptypes联合类型断点给出错误

来自分类Dev

在React Component中不使用Proptypes的任何理由

来自分类Dev

如何在React中将PropTypes与Typescript一起使用

来自分类Dev

反应PropTypes。强制数组为特定的React类型

Related 相关文章

热门标签

归档