Reactjs 如何检查配置文件图像是否存在,或者在react应用程序中使用回退jpg
我正在React应用程序中显示搜索结果。并非所有用户都存在文件Reactjs 如何检查配置文件图像是否存在,或者在react应用程序中使用回退jpg,reactjs,Reactjs,我正在React应用程序中显示搜索结果。并非所有用户都存在文件img src={/users/${id}/avatar.jpg}。用户的性别可在$gender字段中找到。如果他们没有上传avatar.jog,我想使用male.jpg表示性别=男性,使用女性.jpg表示性别=女性 以下是组件代码: import React, { Component } from 'react' import AppLink from '../../others/link/link'
img src={
/users/${id}/avatar.jpg}
。用户的性别可在$gender
字段中找到。如果他们没有上传avatar.jog,我想使用male.jpg表示性别=男性,使用女性.jpg表示性别=女性
以下是组件代码:
import React, { Component } from 'react'
import AppLink from '../../others/link/link'
class SearchResult extends Component {
</span>
</div>
<div className="mb1">
<span><span className="text-bold">Gender: src here</span>
</div>
</div>
</div>
</div>
)
}
}
export default SearchResult
import React,{Component}来自“React”
从“../../others/link/link”导入AppLink
类SearchResult扩展组件{
性别:这里是src
)
}
}
导出默认搜索结果
确定用户档案图像的逻辑可能更好地放在您的后端,以便您获取和显示化身图像的总体设计更简单、更可靠
如果用户没有上传化身图像,则服务器可以通过用户的id
(即,如果已经上传了化身,则服务化身,或者服务性别图像作为后备方案)来决定为该用户服务什么图像。这将在前端代码中保存潜在问题(即有效的客户端用户数据,但服务器上没有化身图像,导致图像未找到错误)
然而,如果在定义用户id
时,您知道存在化身,那么以下可能是您的需求:
class SearchResult extends Component {
render() {
let {
id,
username,
firstname,
surname,
gender
} = this.props
// Determine the avatarImage path depending on the existance of a valid
// user id. If user id is invalid, fallback to an image based on gender
const avatarImage = (id !== undefined && id !== null) ?
`/users/${id}/avatar.jpg` : `/${ gender }.jpg`
return (
<div className="user_item">
<div className="user-container">
<div className="user-l">
<div className="text-center">
<AppLink url={`/profile/${username}`}>
{/* Apply the computed avatarImage to the img element /*}
<img src={ avatarImage } className="user_avatar" />
</AppLink>
</div>
</div>
<div className="user-m half-container">
<div className="halfL">
<div className="mb1">
<AppLink
url={`/profile/${username}`}
className="lead m2 s_userName"
label={username}
/>
</div>
<span>{firstname} {surname}</span>
</div>
<div className="halfR">
<div className="mb1">
<span>
<span className="text-bold">Age:</span> {age}
</span>
</div>
<div className="mb1">
<span><span className="text-bold">Gender:</span> {gender}</span>
</div>
</div>
</div>
<div className="mb1">
<AppLink
url={`/profile/${username}`}
className="btn btn-sm"
label={`Contact ${username}`}
/>
</div>
</div>
</div>
</div>
)
}
}
export default SearchResult
类搜索结果扩展组件{
render(){
让{
身份证件
用户名,
名字,
姓,
性别
}=这是道具
//根据存在的有效数据确定avatarImage路径
//用户id。如果用户id无效,请返回基于性别的图像
const avatarImage=(id!==未定义和id!==空)?
`/users/${id}/avatar.jpg`:`/${gender}.jpg`
返回(
{/*将计算的avatarImage应用于img元素/*}
{名字}{姓氏}
年龄:{Age}
性别:{Gender}
)
}
}
导出默认搜索结果
这个答案不是一个理想的解决方案(如上所述,您应该在数据库中存储用户的化身状态),但是它显示了一种从客户端解析用户化身的策略,以实现您的目标
简而言之,这种方法将向后端发出请求,以查看服务器上是否存在用户的化身图像。如果请求成功,则该化身图像url存储在组件中并用于后续呈现。
如果请求失败,组件将应用“回退”行为——也就是说,它将使用输入道具推断“性别”图像,类似于上面所示
请参阅下面的[更新]
标签,了解当前代码中的相关新增内容:
class SearchResult extends Component {
constructor(props) {
super(props)
/* [UPDATED] Setup the default userImage to be initially displayed */
this.state = {
userImage : `/images/users.jpg`
}
}
/* [UPDATED] When the component is mounted, use the id and gender props
to decide which image to display for the user
*/
componentDidMount() {
const { id, gender } = this.props
const avatarImage = `/users/${id}/avatar.jpg`
/* [UPDATED] Query the server for the user's avatar - if the query
succeeds then use the avatar image, otherwise fallback to gender
image. In either case, the userImage is stored in the components
state
*/
fetch(avatarImage).then(response => {
if(!response.ok) {
this.setState({ userImage : `/${ gender }.jpg` })
}
else {
this.setState({ userImage : `/users/${id}/avatar.jpg` })
}
})
}
render() {
let {
id,
username,
firstname,
surname,
gender
} = this.props
{/* [UPDATED] Extract userImage from state /*}
const { userImage } = this.state
return (
<div className="user_item">
<div className="user-container">
<div className="user-l">
<div className="text-center">
<AppLink url={`/profile/${username}`}>
{/* [UPDATED] Apply the userImage to the img element based on state /*}
<img src={ userImage } className="user_avatar" />
</AppLink>
</div>
</div>
<div className="user-m half-container">
<div className="halfL">
<div className="mb1">
<AppLink
url={`/profile/${username}`}
className="lead m2 s_userName"
label={username}
/>
</div>
<span>{firstname} {surname}</span>
</div>
<div className="halfR">
<div className="mb1">
<span>
<span className="text-bold">Age:</span> {age}
</span>
</div>
<div className="mb1">
<span><span className="text-bold">Gender:</span> {gender}</span>
</div>
</div>
</div>
<div className="mb1">
<AppLink
url={`/profile/${username}`}
className="btn btn-sm"
label={`Contact ${username}`}
/>
</div>
</div>
</div>
</div>
)
}
}
export default SearchResult
类搜索结果扩展组件{
建造师(道具){
超级(道具)
/*[更新]设置初始显示的默认用户图像*/
此.state={
userImage:`/images/users.jpg`
}
}
/*[更新]安装组件时,使用id和性别道具
决定要为用户显示的图像
*/
componentDidMount(){
const{id,gender}=this.props
const avatarImage=`/users/${id}/avatar.jpg`
/*[更新]向服务器查询用户的化身-如果查询
然后使用化身图像,否则返回到性别
在这两种情况下,userImage都存储在组件中
状态
*/
获取(avatarImage)。然后(响应=>{
如果(!response.ok){
this.setState({userImage:`/${gender}.jpg`})
}
否则{
this.setState({userImage:`/users/${id}/avatar.jpg`})
}
})
}
render(){
让{
身份证件
用户名,
名字,
姓,
性别
}=这是道具
{/*[UPDATED]从状态提取userImage/*}
const{userImage}=this.state
返回(
{/*[UPDATED]基于状态将userImage应用于img元素/*}
{名字}{姓氏}
年龄:{Age}
性别:{Gender}
)
}
}
导出默认搜索结果
希望这有帮助 谢谢你的回答。id将始终存在。如果用户上传了一个化身,我会将其存储在用户的文件夹中。因此,检查id是否存在将不起作用。正如我在问题中提到的-
文件img src={/users/${id}/avatar.jpg}并不适用于所有用户
您是否提供了任何方法让客户端应用程序确定后端用户是否存在avatar.jpg
?不,我只是让他们上传一个直接进入一个名为其id的文件夹的图像。。例如,用户456的图像将作为avatar.jpg保存在名为456的文件夹中。。这是我第一次想到有阿凡达的数据库专栏会很好。如果没有,我必须检查文件夹中的文件是否存在..是-也可以检查组件