如何修复this.state。*。map不是函数?

时间:2019-02-13 07:39:20

标签: javascript reactjs

我想从组件中导出一行,但是不知道问题出在哪里

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不是函数异常

4 个答案:

答案 0 :(得分:1)

问题可能来自如何将行传递到组件。使用以下语法,您的组件将完美运行:

<TableRow>
    {['Am row', 'haha', 'yes', 'another row']}
</TableRow>

我还更改了已弃用的componentWillMount的{​​{1}}。

工作示例:

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'>可以简化为一行,以实现完全相同的行为:

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'))

答案 1 :(得分:0)

componentWillMount被认为是旧版。它在渲染之前被调用,因此会导致您的问题。顺便说一句,您应该改为在componentDidMount上设置状态。

答案 2 :(得分:0)

如果您确实需要将行转换为状态,则这是一个典型的getDerivedStateFromProps问题。这样,您一开始就不会触发双重状态更改,但是您的状态将立即包含所需的数据。否则,直接从props渲染数据,然后将组件转换为functional component

答案 3 :(得分:-1)

问题实际上是您正在将行设置为子级(在componentWillMount处),而您无法知道子级是数组,单个元素还是未定义(无子级)。

React具有helper来处理孩子的打字,您可以这样做:

render() {
  return React.Children.map(this.state.row, (el,i) => {
    return (<tr>{el}</tr>)
  }) || false
}

另一方面,通常将not recommended复制道具到状态,除非您只是播下一些初始状态,然后将其修改。您也可以从渲染器访问道具。