You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React兄弟组件数据传递配置:Content向TableGenerator传filterArray

排查你的React组件数据传递问题

我帮你梳理了代码里几个关键问题,这些问题导致filterArray没法正确传递给TableGenerator,咱们一个个来解决:


1. App组件未初始化state

你的App组件里直接使用this.state.filterArray,但没有在构造函数里初始化state,这会导致首次渲染时this.state是undefined,进而触发报错。

修复方式:给App组件添加初始state:

class App extends Component {
  constructor(props) {
    super(props);
    // 初始化state,默认filterArray为空数组
    this.state = {
      filterArray: []
    };
  }

  updateData = (value) => {
    this.setState({filterArray: value})
  }

  // ... 其余render代码不变
}

2. TableGenerator是函数组件,不能用this.props

你写的TableGenerator是函数组件,函数组件的props是通过参数传入的,不是this.props。而且你也没有接收props参数,导致根本拿不到传入的data。

修复方式:接收props参数,并用它来处理数据:

// 接收props参数
function TableGenerator(props) {
  const allUsers = [
    {пользователь: "Александра"},
    {пользователь: "Шура"},
    {пользователь: "Настя"},
    {пользователь: "Ира"},
    {пользователь: "Ваня"},
    {пользователь: "Жора"},
    {пользователь: "Гриша"}
  ];

  // 根据传入的filterArray过滤用户数据(这里简单实现关键词匹配,可按需调整)
  const filteredUsers = props.data.length > 0 
    ? allUsers.filter(user => {
        const keywords = props.data.map(k => k.replace('*', ''));
        return keywords.some(keyword => user.пользователь.includes(keyword));
      })
    : allUsers;

  return (
    <Paper style={{maxWidth: 936, marginLeft: '250px'}}>
      <Table>
        <TableHead>
          <TableRow>
            {Object.keys(allUsers[0]).map((header, i) => (
              <TableCell key={i} align="center">{header.split("_").join(" ")}</TableCell>
            ))}
          </TableRow>
        </TableHead>
        {/* 现在可以正确显示props数据了 */}
        <p>当前过滤关键词: {props.data.join(', ') || '无'}</p>
        <TableBody>
          {/* 使用过滤后的filteredUsers渲染 */}
          {filteredUsers.map((user, i) => (
            <TableRow key={i}>
              {Object.values(user).map((v, j) => (
                <TableCell key={j} align="center">{v}</TableCell>
              ))}
            </TableRow>
          ))}
        </TableBody>
      </Table>
    </Paper>
  );
}

3. Content组件里错误修改state + 按钮点击事件错误

在parseInput方法里,你直接修改了this.state.filterArray,这违反了React的state更新规则——必须用setState来修改state,否则组件不会重新渲染。另外,Обучить按钮的onClick={this.parseInput()}会导致组件渲染时立即执行这个方法,而不是点击时执行,应该传递函数引用。

修复方式:

class Content extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      textInput: '',
      filterArray: []
    }
  }

  clear = () => {
    this.setState({ textInput: '', filterArray: [] })
  }

  parseInput = () => {
    let tempArray = this.state.textInput.split(" ");
    // 用setState修改filterArray,而不是直接赋值
    this.setState({
      filterArray: tempArray.filter(word => word.endsWith('*'))
    });
  }

  render() {
    return (
      <Paper style={{maxWidth: 936, marginLeft: '250px', overflow: 'hidden'}}>
        <AppBar position="static" color="default" elevation={0}>
          <Toolbar>
            <Grid container spacing={16} alignItems="center">
              <Grid item xs>
                {/* ... TextField代码不变 */}
              </Grid>
              <Grid item>
                {/* 去掉括号,传递函数引用 */}
                <Button variant="contained" color="primary" style={{background: 'linear-gradient(45deg, #00ACD3 30%, #00BE68 90%)'}} onClick={this.parseInput} >
                  Обучить
                </Button>
                {/* ... 其余按钮代码不变 */}
              </Grid>
            </Grid>
          </Toolbar>
        </AppBar>
      </Paper>
    );
  }
}

4. 组件闭合问题

你的代码里App、TableGenerator、Content组件都没有正确闭合(缺少}或者}),这会导致语法错误,一定要确保每个类组件和函数组件都有正确的闭合标记。


完整修正后的代码示例

把上面的修改整合后,完整代码大概是这样:

import React, { Component } from 'react';
import { Paper, Table, TableHead, TableRow, TableCell, TableBody, AppBar, Toolbar, Grid, TextField, Button, Tooltip, IconButton } from '@material-ui/core';
import RefreshIcon from '@material-ui/icons/Refresh';

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      filterArray: []
    };
  }

  updateData = (value) => {
    this.setState({ filterArray: value });
  };

  render() {
    return (
      <div className="App">
        {/* 假设Header组件已定义 */}
        <Header />
        <br />
        <Content updateData={this.updateData} />
        <br />
        <TableGenerator data={this.state.filterArray} />
      </div>
    );
  }
}

function TableGenerator(props) {
  const allUsers = [
    { пользователь: "Александра" },
    { пользователь: "Шура" },
    { пользователь: "Настя" },
    { пользователь: "Ира" },
    { пользователь: "Ваня" },
    { пользователь: "Жора" },
    { пользователь: "Гриша" }
  ];

  // 简单的过滤逻辑:匹配关键词(去掉*)
  const filteredUsers = props.data.length > 0
    ? allUsers.filter(user => {
        const keywords = props.data.map(k => k.replace('*', ''));
        return keywords.some(keyword => user.пользователь.includes(keyword));
      })
    : allUsers;

  return (
    <Paper style={{ maxWidth: 936, marginLeft: '250px' }}>
      <Table>
        <TableHead>
          <TableRow>
            {Object.keys(allUsers[0]).map((header, i) => (
              <TableCell key={i} align="center">{header.split("_").join(" ")}</TableCell>
            ))}
          </TableRow>
        </TableHead>
        <p>当前过滤关键词: {props.data.join(', ') || '无'}</p>
        <TableBody>
          {filteredUsers.map((user, i) => (
            <TableRow key={i}>
              {Object.values(user).map((v, j) => (
                <TableCell key={j} align="center">{v}</TableCell>
              ))}
            </TableRow>
          ))}
        </TableBody>
      </Table>
    </Paper>
  );
}

class Content extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      textInput: '',
      filterArray: []
    };
  }

  clear = () => {
    this.setState({ textInput: '', filterArray: [] });
  };

  parseInput = () => {
    let tempArray = this.state.textInput.split(" ");
    this.setState({
      filterArray: tempArray.filter(word => word.endsWith('*'))
    });
  };

  render() {
    return (
      <Paper style={{ maxWidth: 936, marginLeft: '250px', overflow: 'hidden' }}>
        <AppBar position="static" color="default" elevation={0}>
          <Toolbar>
            <Grid container spacing={16} alignItems="center">
              <Grid item xs>
                <TextField
                  fullWidth
                  placeholder="Введите фразу которую нужно обучить"
                  id='textInput'
                  InputProps={{
                    disableUnderline: true,
                  }}
                  value={this.state.textInput}
                  onChange={(e) => { this.setState({ textInput: e.target.value }) }}
                />
              </Grid>
              <Grid item>
                <Button
                  variant="contained"
                  color="primary"
                  style={{ background: 'linear-gradient(45deg, #00ACD3 30%, #00BE68 90%)' }}
                  onClick={this.parseInput}
                >
                  Обучить
                </Button>
                <Button
                  variant="contained"
                  color="primary"
                  style={{ background: 'linear-gradient(45deg, #00ACD3 30%, #00BE68 90%)' }}
                  onClick={() => { this.props.updateData(this.state.filterArray) }}
                >
                  Генерировать
                </Button>
                <Tooltip title="Сбросить">
                  <IconButton>
                    <RefreshIcon color="inherit" style={{ display: 'block' }} id='clearButton' onClick={this.clear} />
                  </IconButton>
                </Tooltip>
              </Grid>
            </Grid>
          </Toolbar>
        </AppBar>
      </Paper>
    );
  }
}

// 假设Header组件定义
function Header() {
  return <h1>Приложение</h1>;
}

export default App;

现在你可以测试一下:输入类似Шу* Наст*的文本,点击"Обучить",然后点击"Генерировать",TableGenerator就会显示匹配的用户了。

内容的提问来源于stack exchange,提问作者Sasha Sedova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:38:54