[英]How to fix this.state.*.map is not a function?
我想從組件中導出一行,但不知道問題出在哪里
import React, {Component} from 'react';
class TableRow extends Component {
state = {
row: []
};
componentWillMount() {
this.setState({row: this.props.children});
}
render() {
return this.state.row.map((el,i) => {
return (<tr>{el}</tr>)
})
}
}
export default TableRow;
this.state.row.map不是函數異常
問題可能出在您如何將行傳遞到組件上。 使用以下語法,您的組件將完美運行:
<TableRow>
{['Am row', 'haha', 'yes', 'another row']}
</TableRow>
我還更改了componentWillMount
,它已棄用到componentDidMount
。
工作示例:
class TableRow extends React.Component { state = { row: [] }; componentDidMount() { this.setState({ row: this.props.children }); } render() { return this.state.row.map((el, i) => <tr>{el}</tr>) } } const App = () => ( <TableRow> {['Am row', 'haha', 'yes', 'another row']} </TableRow> ) ReactDOM.render(<App />, document.getElementById('root'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.0/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.0/umd/react-dom.production.min.js"></script> <div id='root'>
但是,我看不到有任何理由使用有狀態組件,您可以直接從props中獲取值。
對於完全相同的行為,可以將TableRow
簡化為一行:
const TableRow = ({ children }) => children.map(el => <tr key={el}>{el}</tr>)
范例:
const TableRow = ({ children }) => children.map(el => <tr key={el}>{el}</tr>) const App = () => ( <TableRow> {['Am row', 'haha', 'yes', 'another row']} </TableRow> ) ReactDOM.render(<App />, document.getElementById('root'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.0/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.0/umd/react-dom.production.min.js"></script> <div id='root'>
componentWillMount被認為是舊版。 它在渲染之前被調用,因此會導致您的問題。 順便說一句,您應該改為在componentDidMount上設置狀態。
如果您確實需要將行轉換為狀態,則這是典型的getDerivedStateFromProps問題。 這樣,您一開始就不會觸發雙重狀態更改,但是您的狀態將立即包含所需的數據。 否則,直接從props渲染數據,然后將您的組件轉換為功能組件 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.