我如何在ajax调用中使用响应来在react中的jsx中设置一个值,类似于Angular 2中的filter/pipes
How do I use the response in an ajax call to set a value in my jsx in react similar to filter/pipes in Angular 2?
我正在学习react,并希望将我的一个angular 2组件转换为react组件。我遇到了一个问题,在Angular 2中,我使用管道来转换模板中的文本变量,如下所示。
<span>{{ message.What | translate}}</span>
翻译管道从我的管道调用这个函数。ts文件
@Pipe({
name: "translate",
pure:false
})
export class Translate implements PipeTransform{
private headers = new Headers();
private translated: string = null;
private prevtext = '';
constructor(private http: Http) {
this.headers.append('Content-Type', 'application/x-www-form-urlencoded');
}
transform(text: string): string {
if (text !== this.prevtext) {
this.prevtext = text;
this.translated = null;
this.http.post('https://translate.yandex.net/api/v1.5/tr.json/translate?lang=es-en&key=trnsl.1.1.20160702T062231Z.b01e74e50f545073.41cbb76d976818cfaa0e1ac3ac78b561079e3420&text='+text,{},{headers:this.headers}).map((response:Response)=>{
return response.json();
}).subscribe((data)=>{
this.translated= data.text[0];
});
}
return this.translated;
}
}
现在在react中,我将我的标记移动到js文件中,我的渲染看起来像这样
render() {
const { props, onScroll } = this;
return (
<div className="message-content" ref="messageList" onScroll={ onScroll }>
<ul className="message-list">
{ props.history.map((messageObj,index) => {
const imgURL = '//robohash.org/' + messageObj.Who + '?set=set2&bgset=bg2&size=70x70';
const messageDate = new Date(messageObj.When);
const messageText = messageObj.What;
const messageDateTime = messageDate.toLocaleDateString() +
' at ' + messageDate.toLocaleTimeString();
var classes = 'message-item avatar' ;
var me = props.userID == messageObj.Who ? ' me':'';
classes = classes + me;
return (
<li className={classes} key={ messageObj.When }>
<div className="tint"><img src={ imgURL } alt={ messageObj.Who } className="circle" /></div>
<span className="title">Anonymous robot #{ messageObj.Who }</span>
<p className="message-text">
<span>{props.translate(messageText)}</span>
</p>
<span className="message-date">{ messageDateTime }</span>
</li>
);
}) }
</ul>
</div>
);
}
道具。将调用
translate = (msg,index) =>{
const { props } = this;
$.ajax({
url:'https://translate.yandex.net/api/v1.5/tr.json/translate?lang=es-en&key=trnsl.1.1.20160702T062231Z.b01e74e50f545073.41cbb76d976818cfaa0e1ac3ac78b561079e3420&text='+msg,
method:"POST",
data:JSON.stringify({"input":msg}),
contentType: 'application/x-www-form-urlencoded',
crossDomain:true
}).success((data)=>{
//set variable to data
}).error((error)=>{
console.log(error);
});
}
}
我卡住的地方是,在angular 2中,我在回调中设置了变量,angular会跟踪变化并更新值。我想知道我该如何反应。我见过状态改变之类的例子,但没有一个展示了如何从对象数组中更新对象属性的值。如有任何帮助,不胜感激
您应该将每条消息作为一个单独的组件。在消息组件中,通过ajax调用获取翻译后的消息并将其存储在状态
class MessagesContainer extends React.component {
render() {
const { props, onScroll } = this;
return (
<div className="message-content" ref="messageList" onScroll={ onScroll }>
<ul className="message-list">
{ props.history.map((messageObj,index) => {
return <Message messageText={messageObj.What} message={messageObj}/>
}) }
</ul>
</div>
);
}
Class Message extends React.Component {
constructor(){
super(props);
this.state = {
messageTxt: this.props.messageTxt
}
}
componentDidMount(){
const { props } = this;
$.ajax({
url:'https://translate.yandex.net/api/v1.5/tr.json/translate?lang=es-en&key=trnsl.1.1.20160702T062231Z.b01e74e50f545073.41cbb76d976818cfaa0e1ac3ac78b561079e3420&text='+msg,
method:"POST",
data:JSON.stringify({"input":msg}),
contentType: 'application/x-www-form-urlencoded',
crossDomain:true
}).success((data)=>{
this.setState({
messageText: data
//set variable to data
}).error((error)=>{
console.log(error);
});
}
}
render() {
return (
const imgURL = '//robohash.org/' + messageObj.Who + '?set=set2&bgset=bg2&size=70x70';
const messageDate = new Date(messageObj.When);
const messageText = this.props.messageText;
const messageDateTime = messageDate.toLocaleDateString() +
' at ' + messageDate.toLocaleTimeString();
var classes = 'message-item avatar' ;
var me = props.userID == messageObj.Who ? ' me':'';
classes = classes + me;
return (
<li className={classes} key={ messageObj.When }>
<div className="tint"><img src={ imgURL } alt={ messageObj.Who } className="circle" /></div>
<span className="title">Anonymous robot #{ messageObj.Who }</span>
<p className="message-text">
<span>{props.translate(messageText)}</span>
</p>
<span className="message-date">{ messageDateTime }</span>
</li>
);
);
}
}
相关文章:
- 使用mongodb更新中的一个变量
- 在数组中的一个元素上设置多个值
- 希望日期开始结束于while循环中的一个房间id的一个数组
- 我怎么能让流星简单模式中的一个字段等于一个js变量,并且仍然让用户填写简单模式的其余部分
- 可以't将sessionStorage设置为Javascript中的一个变量
- 使用drupal中自定义javascript文件中的一个函数
- 将鼠标悬停在Angular JS中的一个元素上,并将Class添加到另一个元素中
- HTML-从mysql生成的选择框中的一个选项更改文本区域的颜色
- jQuery悬停动画只在其他类似元素中的一个元素上
- 使用javascript的Phaser中的一个奇怪行为
- Vue.js获取组件中的一个元素
- 我可以使用JS一次使用JSON数组中的一个字符串吗
- 为什么regex只验证字段中的一个字符,而不是所有输入的字符
- 如何通过 JS 将内容从一个表单中的一个文本框复制到另一个表单中的另一个文本框
- 将路由器配置放在Aurelia中的一个单独文件中
- JavaScript中的一个错误
- 是否可以从独立于摄影机的three.js场景中的一个点应用雾
- $scope$观察数组中的一个特定对象——Angular JS控制器
- 反转一个数组,该数组是Javascript中对象中的一个值
- 想要在php中的一个文件中写入2个JavaScript变量