javascript - s 时改变子组件的 prop

标签 javascript reactjs graphql gatsby

我正在使用 Gatsby 构建我的站点,并且我正在尝试在用户单击类(class)标题时更改 Plyr 组件的 URL 属性。现在,URL 设置在 this.state 中,数据从 GraphQL 查询提取到 Contentful。

这是一个实时版本:https://brave-jepsen-d8ae28.netlify.com/courses/my-first-course

我创建了一个 handleChange 函数来使用 event.target.id 设置状态,但是一旦我点击类(class)段落标签,它就会返回错误。知道发生了什么事吗?我测试了事件 ID 是用 console.log(event.target.id) 捕获的,它是,所以我假设一旦我尝试设置它就会再次渲染组件国家。

感谢任何帮助!

import React, { Component } from 'react'
import { Link, graphql } from 'gatsby'
import Layout from '../components/layout' 
import Plyr from 'react-plyr'
import '../components/plyr.css'

// On click, set the value of that elements video url to video player url value

class CourseTemplate extends Component {
    constructor(props) {
        super(props);
        this.state = {
            url: props.data.contentfulCourse.featureVideo
        };
        this.handleChange = this.handleChange.bind(this);
    };

    handleChange(event) {
        event.stopPropagation();
        // console.log(event.target.id)
        this.setState(prevState => ({
             url: event.target.id
        }));
      }

    render() {
        const courseContent = this.props.data.contentfulCourse
    return (
        <Layout>
            <Plyr key={this.state.url} type="vimeo" videoId={this.state.url}/>
            <p>{this.state.url}</p>
            <h1>{courseContent.title}</h1>
            <p>{courseContent.shortDescription}</p>
            <div>
                {courseContent.teachers.map(teacher => (
                    <div key={teacher.id}>
                        <p>by <Link to={`/teachers/${teacher.id}`}>{teacher.name}</Link></p>
                    </div>
                ))}
            </div>
            <div>
                {courseContent.lessons.map(lesson => (
                    <div key={lesson.lessonVideo}>
                        <p onClick={this.handleChange} id={lesson.lessonVideo}>{lesson.title}</p>
                    </div>
                ))}
            </div>
        </Layout>   
    )
    }
};

export default CourseTemplate

export const query = graphql`
  query CourseTemplate($id: String!) {
    contentfulCourse(id: {eq: $id}) {
      title
      shortDescription
      featureVideo
      slug
      teachers {
        id
        name
      }
      lessons {
        id
        title
        lessonVideo
        slug
      }
    } 
  }
`

我收到的错误:

警告:出于性能原因,此合成事件被重用。如果您看到这一点,则表示您正在访问已发布/无效合成事件的属性“目标”。这被设置为空。如果您必须保留原始合成事件,请使用 event.persist()。

TypeError:无法在 ProxyComponent.eval 读取 null 的属性“id”

最佳答案

您根本不需要为此使用event。您也不需要将函数传递给 setState,因为您没有对 prevState 做任何事情。

import React, { Component } from "react"
import { Link, graphql } from "gatsby"
import Layout from "../components/layout"
import Plyr from "react-plyr"
import "../components/plyr.css"

class CourseTemplate extends Component {
  constructor(props) {
    super(props)
    this.state = {
      url: props.data.course.featureVideo,
    }
    this.setVideoUrl = this.setVideoUrl.bind(this)
  }

  setVideoUrl(url) {
    this.setState({ url })
  }

  render() {
    const courseContent = this.props.data.course

    return (
      <Layout>
        <Plyr type="vimeo" videoId={this.state.url} />

        <div>
          {courseContent.lessons.map(lesson => (
            <div key={lesson.id}>
              <p onClick={() => this.setVideoUrl(lesson.videoUrl)}>
                {lesson.title}
              </p>
            </div>
          ))}
        </div>
      </Layout>
    )
  }
}

export default CourseTemplate

export const query = graphql`
  query CourseTemplate($id: String!) {
    course: contentfulCourse(id: { eq: $id }) {
      title
      shortDescription
      featureVideo
      slug
      teachers {
        id
        name
      }
      lessons {
        id
        title
        videoUrl: lessonVideo
        slug
      }
    }
  }
`

关于javascript - s 时改变子组件的 prop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53264866/

相关文章:

javascript - 如何使同一函数在不同时间间隔调用时执行代码的不同部分

reactjs - 当在具有唯一键的表中的内联按钮上使用时,Material UI Popover 会被抛出到左上角

reactjs - 在 vs code 中调试 webpack 开发服务器?

javascript - React.js - 检测在没有 ref 的情况下调用函数的元素

reactjs - 如何在 Gatsby 中查询特定语言的 markdown 文件?

node.js - 如何在prisma-binding npm中获得总匹配记录数

javascript - 通过Javascript设置Bootstrap工具提示的内容

javascript - HTML5 Canvas API - 用斜体格式化单个单词

javascript - div 中的表格是否忽略了最大宽度?

javascript - 网络错误 : Unexpected token < in JSON at position 0 at new ApolloError