javascript - 记录更新后组件不会重新呈现
问题描述
我试图根据当前用户 ID 是否等于手风琴 ID 来显示一个图标。
即,我试图让制作卡片的用户成为可以编辑卡片的用户。
这开始发生//Update icon
在代码中所说的地方。
记录成功更新(我可以在数据库中看到,当您刷新页面时,它显示正确且没有错误),但是当组件尝试重新渲染时,我收到此错误:https ://imgur.com/a /YVTDg82
我觉得这很明显,我错过了一些简单的东西。
import React from "react"
import PropTypes from "prop-types"
import { Accordion, Icon, Input, Form, Button, Modal, Dropdown } from 'semantic-ui-react'
//components
import UpdateCard from "./UpdateCard"
import LikeUnlike from "./LikeUnlike"
class Card extends React.Component {
constructor(props) {
super(props)
this.state = {
activeIndex: null,
search: ''
}
}
updateSearch = (event) => {
this.setState({ search: event.target.value.substr(0, 20) })
}
//Opens and closes the accordion
handleClick = (e, titleProps) => {
const { index } = titleProps
const { activeIndex } = this.state
const newIndex = activeIndex === index ? -1 : index
this.setState({ activeIndex: newIndex })
}
render() {
// const options = [
// { key: 'css', text: 'CSS', value: 'css' },
// { key: 'html', text: 'HTML', value: 'html' },
// { key: 'javascript', text: 'Javascript', value: 'javascript' },
// { key: 'rails', text: 'Rails', value: 'rails' },
// { key: 'react', text: 'React', value: 'react' },
// { key: 'ruby', text: 'Ruby', value: 'ruby' },
// ]
const { activeIndex } = this.state
const { showEditMenu } = this
let filteredCards = this.props.librarys.filter(
(library) => {
return library.title.toLowerCase().indexOf(this.state.search.toLowerCase()) !== -1 || library.desc.toLowerCase().indexOf(this.state.search.toLowerCase()) !== -1
}
)
return (
<React.Fragment>
<div className='search-bar'>
<Input fluid icon={<Icon name='search' inverted circular link />} value={this.state.search} onChange={this.updateSearch} placeholder="Search Syntaxes" />
</div>
<ul>
{filteredCards.map((librarys, index) => {
return (
<div key={index} >
<Accordion>
<Accordion.Title >
<Icon
name='dropdown'
active={activeIndex === index}
index={index}
onClick={this.handleClick}
/>
<Icon name='trash alternate'
onClick={() => {
this.props.handleDelete(librarys.id)
}}
/>
{
//Update Icon
librarys.user.id === this.props.currentUser.id ?
<UpdateCard
handleUpdate={this.props.handleUpdate}
libraryId={librarys.id}
likes={librarys.likes}
librarys={librarys}
/>
: ''
}
Title: {librarys.title} Likes: {librarys.likes}
<LikeUnlike
handleUpdate={this.props.handleUpdate}
libraryId={librarys.id}
librarys={librarys}
/>
</Accordion.Title>
<Accordion.Content active={activeIndex === index}>
Description: <br></br>
{librarys.desc} <br></br>
Markdown: <br></br>
{librarys.markdown}
</Accordion.Content>
</Accordion>
</div>
)
})}
</ul>
</React.Fragment>
);
}
}
export default Card
解决方案
在比较值之前,您需要进行空值检查。如下所示:
librarys.user && librarys.user.id === this.props.currentUser.id ?
// same stuff here
推荐阅读
- doctrine-orm - symfony4 如何使用实体关系创建 DataFixtures
- machine-learning - 测量 ROC 和 AUC
- javascript - 如何使用 vscode 设置 jest typescripts 测试以在调试模式下运行
- jquery - attr() 返回未定义
- python - 有没有使用 vuejs 和 django 进行身份验证的解决方案?
- java - 在初始化页面对象期间,我在 pagefactory 中缺少什么?在元素识别期间获取 NullpointerException
- javascript - User.id 未定义
- javascript - 如何将数据从 xml 存储到 php 变量,该变量是单个标签内的数据集合,如数组
- acumos - Acumos (oneclick) 安装需要打开哪些端口
- c# - 如何在 DataTable 中搜索相似的字符串