当前位置: 首页 > 知识库问答 >
问题:

为什么React在将函数从一个组件导出到另一个组件时抛出错误?

刘高峯
2023-03-14

我有两个反应组件Post和Postform。Posts是显示从api获取的帖子列表的组件。Postform组件是一种创建新帖子,然后更新帖子组件的表单。我在Posts中声明了一个函数addPost()为全局函数,并将其绑定在Posts构造函数中。然后,addPost()方法从Posts导出,并导入到Postform组件中,在那里我想使用导入的addPost()方法更新Posts组件的状态

但是,我收到一个错误,指出这在Post组件的addPost()内部无效。从另一个同级更新同级的过程取自此博客文章

我包括这两个组件的代码以供参考。

这是Posts.js即,

import React, { Component } from 'react'

export function addPost(posts){
  this.setState({ posts });
}

export default class Posts extends Component {
 constructor(props) {
    super(props);
    this.state = {
      posts: []
    }
   this.getPosts = this.getPosts.bind(this);
   addPost = addPost.bind(this);
  }

  getPosts(posts) {
    this.setState({ posts, })
    console.log(this.state);
  }


  componentWillMount() {
    fetch('https://jsonplaceholder.typicode.com/posts')
      .then(res => res.json())
      .then(posts => this.getPosts(posts));

  }

  render() {
    const posts = this.state.posts;
    const postList = posts.map(post => {
      return (
        <div key={post.id}>
          <div>ID: {post.id}</div>
          <br />
          <div>{post.title}</div>
          <br />
          <div>{post.body}</div>
          <hr />
        </div>
      )
    })

    return (
      <div>
        <h1>Posts</h1>
        <hr />
        {postList}
      </div>
    )
  }
}

这是Postform。js

import React, { Component } from 'react'

import  addPost  from './Posts.js';

export default class Postform extends Component {
  constructor(props) {
    super(props);
    this.state = {
      title: '',
      body : '',
    }
    this.onChange = this.onChange.bind(this);
    this.onSubmit = this.onSubmit.bind(this);
  }

  onChange(event) {
    this.setState({
      [event.target.name]: event.target.value,
    })
  }


  onSubmit(event) {
    const post = {
      title: this.state.title,
      body : this.state.body
    }
    //this is going to start a fetch process to post the new post to the database
    fetch('https://jsonplaceholder.typicode.com/posts',
      {
        method: 'POST',
        headers: {
          'content-type': 'application/json'
        },
        body: JSON.stringify(post),
      })
      .then(res => res.json())
      .then(data => addPost({data}));

    event.preventDefault();

  }
  render() {
    return (
      <div>
        <h1>ADD POST</h1>   
        <form onSubmit={this.onSubmit}>
          <div>
            <label>Title</label>
            <input type="text" name="title" value={this.state.title} onChange={this.onChange} />
          </div>
          <div>
            <label>Body</label>
            <textarea name="body" onChange={this.onChange} value={this.state.body} />
          </div> 
          <br />
          <button type="submit">ADD</button>
        </form>
      </div>
    )
  }
}

共有1个答案

邬英武
2023-03-14

问题在于这些线路:

export function addPost(posts){
  this.setState({ posts });
}

这将不起作用,因为在Post类之外没有this的概念。您应该在父组件中有一个函数(Postform),并以这种方式更新道具。

 类似资料:
  • 我有一个产品组件,我希望将其图片传递给另一个组件,我的图片从Rails后端上传,并映射产品详细信息。我想实现的是,当您单击按钮时,您的产品图片将显示在设计页面中进行自定义设计。 设计页面当您单击设计我按钮时,根据产品,该产品的图片应该出现在设计页面中 陈列

  • 问题内容: 这是我制作的屏幕,我在该屏幕上导入了三个文件,这些文件将在单击单选按钮时显示。另外还有一个相关的移动屏幕,例如,我现在导入了,如您看到的BigText,它包含表格,现在我想在BigTextMobile组件中打印其输入值 问题答案: 为了简化解决方案,您可以执行以下操作: 然后,在 BigText 组件中,您可以通过此回调添加一些数据,如下所示: 并将数据从状态传输到您的 BigText

  • 非常感谢任何帮助。 编辑:我不敢相信我居然要明确声明我不想复制粘贴它。

  • 嗨,我有一个对象,它正在使用一个组件中的可观察到的东西从api更新,我想捕获同一对象对另一个组件的更改。这两个组件都是两个选项卡。最初是根据路由更新数据。以下是正在更新的数据: 我在这里捕获数据: 在中,数据最初是从路由获取的。考虑到上述情况,我有两个问题: 如果应用程序有多个组件,我想我必须在每个组件中事件,这将是一个很好的做法。请提出任何替代方法? 由于数据来自服务器,为什么不从中的获取更新的

  • 问题内容: 许多模板语言都有“ slots”或“ yield”语句,它们允许进行某种形式的控制反转,以将一个模板包装在另一个模板中。 Angular具有“ transclude”选项。 Rails有收益声明。如果React.js拥有yield语句,它将看起来像这样: 所需的输出: React,React.js没有。如何定义包装器组件以实现相同的输出? 问题答案: 尝试: 有关更多信息,请参见文档中

  • 许多模板语言都有“slots”或“yield”语句,它们允许进行某种形式的控制反转,将一个模板包装在另一个模板中。 唉,react.js没有。我如何定义包装器组件以实现相同的输出?