В моем приложении react мне нужно проверить параметр id
в URL-адресе, а затем визуализировать представление соответственно (то есть разные представления в случае успешной и неудачной проверки). Вот пример кода:Component Mounting для проверки параметра url перед представлением рендеринга в ReactJs
routes.js
// just relevant lines of code:
import React from 'react';
import { Route, IndexRoute } from 'react-router';
import Foo from '../containers/foo';
const AppRoutes = (
<Route component={Base} path="/">
<Route component={Foo} path="/url/:id"/>
</Route>
);
export default AppRoutes;
класса Foo
import React, { Component } from 'react';
import { isValid } from '../service';
class Foo extends Component {
state = {
check : true
}
componentWillMount(){
if (isValid(this.props.params.id) == false || 'undefined') {
console.log(isValid(this.props.params.id));
this.setState({
check : false
});
}
}
render() {
if (!this.state.check){
return(...);
}else{
return(...);
}
};
}
export default Foo;
service.js
"use strict";
function createCORSRequest(method, url) {
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr) {
// XHR for Chrome/Firefox/Opera/Safari.
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined") {
// XDomainRequest for IE.
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
// CORS not supported.
xhr = null;
}
return xhr;
}
function fetchId(method, url, id, callback){
var xhr = createCORSRequest(method, url);
if (!xhr) return;
xhr.addEventListener("readystatechange", callback);
xhr.setRequestHeader("content-type", "application/json");
xhr.send(JSON.stringify(query));
}
function isValid(id){
let url = 'https://some/api/url/';
return fetchId('POST', url, id, function(){
return (this.readyState===4 && this.responseText.length>0) ? true : false;
});
}
export default {isValid}
Сейчас console.log(isValid(this.props.params.id)
в componentWillMount()
всегда печатает undefined
, независимо от того, id
действителен или нет. Кажется, могут быть две проблемы: либо я неправильно возвращаю логический ответ isValid()
, либо ошибочно использую componentWillMount()
. Я тоже подумал о docs и узнал, что componentWillMount()
фактически запускается до render()
.
Может ли кто-нибудь указать на реальную проблему и исправить меня, где я делаю неправильно?
Что вызывает Foo? это параметры, исходящие от реагирующего маршрутизатора? если да, то можете ли вы показать нам, как ваши маршруты настроены? –
@JoPeyper Я обновил вопрос, указав соответствующие строки 'routes.js'. Пожалуйста, не стесняйтесь спрашивать, нет ли чего-то еще. – adi