我无法弄清楚为什么我的组件的Render函数中的replace函数会出错。
TypeError:无法读取未定义的属性“替换”
我只是想替换 services.serviceImage 中的字符串值,并替换“ react-site / public /”,“ 之类的字符串,就像您将通常在任何字符串上都可以进行,我做了一些测试,我可以确认返回的值是一个字符串,并且我进行了其他一些字符串的替换,并且可以正常工作,但是在这种情况下,有些不起作用...为什么?
我已经尝试过作为运气好的正则表达式方法:
imgUrl = imgUrl.replace("/react\-site\/public/g", "");
由于某种原因,我的节点服务器也不会接受doc.serviceImage响应的替换方法!!!
我在这里做错了什么...?
我的完整代码:
import React, {Component} from 'react';
import axios from 'axios';
//import { Link } from "react-router-dom";
import './catalogue.scss';
class ServicesPage extends Component {
state = {
services: [],
loading: false
}
componentDidMount(){
this.setState({
loading: true
});
axios.get('/services')
.then(response => {
console.log(response);
this.setState({
services: response.data.services,
loading: false
});
})
.catch( error => {
console.log(error);
});
document.title = "Pain Relief and Massage Services - LA Therapy";
}//componentDidMount
replaceStr(str, newStr) {
return str = str.replace(str, newStr);
}
render(){
let pageRender;
if(this.state.loading){
pageRender = <div className="pageLoader">Loading... <img src="./images/ui/spinner.svg"/></div>
}else{
{this.state.services.map(services => {
let backgroundUrl = {};
let imgUrl = services.serviceImage;
imgUrl = imgUrl.replace("/react\-site\/public/g", ""); //this string replace is not working
console.log(imgUrl);
if (services.serviceImage) {
backgroundUrl = {
backgroundImage: `url(${imgUrl})`,
backgroundSize: 'cover'
};
}else{
backgroundUrl = {
backgroundImage: 'url(./images/ui/add-image-wide.png)',
backgroundSize: 'cover'
};
pageRender = <div className="columns white-bg">
<div className="grid-x">
{this.state.services.map(services =>
<div key={services._id} className="cell large-6 medium-12 small-12 end padding-all-3x">
<div className="catalogue-medium gray_2-border white-bg margin-distributed round-small" style={backgroundUrl}>
<div className="dark-overlay"></div>
<img src="./uploads/services/1538735070981-1538653957308-back-massage.jpg"/>
<div className="tittle-bottom">{services.name} </div>
</div>
</div>
)}
</div>
</div>
}
})
}
}
return(
<div>
{pageRender}
</div>
);
}
}
export default ServicesPage;
答案 0 :(得分:3)
使用后,您要查看该属性是否有效
let imgUrl = services.serviceImage; <-- read it
imgUrl = imgUrl.replace(...) <-- where the error occurs
if (services.serviceImage) { <-- is truthy
因此将逻辑移到支票内
let imgUrl = services.serviceImage;
if (services.serviceImage) {
imgUrl = imgUrl.replace(...)
或如果您出于某些原因需要imgUrl设置为空字符串
let imgUrl = services.serviceImage || '';
imgUrl = imgUrl.replace(...)
答案 1 :(得分:1)
在实际呈现this.state.services
之前,您可以先检查 { this.state.services.length > 0 && this.state.services.map(services => {
let backgroundUrl = {};
let imgUrl = services.serviceImage;
imgUrl = imgUrl.replace("/react\-site\/public/g", ""); //this string replace is not working
console.log(imgUrl);
$referer = parse_url($_SERVER['HTTP_REFERER']);
$referer = $referer['host'];
答案 2 :(得分:0)
也许最初没有定义imageUrl,请尝试输入字符串,检查变量是否为字符串。代码如下:
imgUrl = typeof imgUrl === 'string' ? imgUrl.replace("/react\-site\/public/g", "") : '';
答案 3 :(得分:0)
将您imgUrl.replace(...)
放在if (services.serviceImage)
语句中。
在某些情况下,services.serviceImage
具有未定义的值,您会得到该值的错误提示。
...
if (services.serviceImage) {
let backgroundUrl = {};
let imgUrl = services.serviceImage;
imgUrl = imgUrl.replace("/react\-site\/public/g", ""); //this string replace is not working
console.log(imgUrl);
backgroundUrl = {
backgroundImage: `url(${imgUrl})`,
backgroundSize: 'cover'
};
}
...
您必须避免使用未定义的值更改状态。您正在获取未定义的值并将其设置为状态。您的状态将被更改并呈现未定义的值。首先,您必须检查services.serviceImage
是否具有值,然后将其设置为状态。其次,在渲染时,将if
语句包装在所有代码上,以确保您将代码运行在真实值上。