[英]Get dropdown title to change to selected dropdown value
我是新手,请尝试通过遵循一些教程来解决这个问题,但是我遇到了一些问题,无法根据下拉列表中选择的值来更改下拉列表标题。 我正在使用react bootstrap
尝试执行此操作,但不确定如何更改标题。
现在,无论何时选择下拉菜单,我都会调用onDropChange
函数,并且尝试将状态设置为所选下拉菜单的值,以便可以在标题中使用它,但我什至无法获取工作。
到目前为止,这是我的代码:
import React, {PropTypes} from 'react';
import {connect} from 'react-redux';
import * as courseActions from '../../actions/courseActions';
import * as ReactBootstrap from 'react-bootstrap';
class CoursesPage extends React.Component {
constructor (props, context) {
super(props, context);
this.state = {
course: {title: ""},
drplist: {drpval: ""}
};
this.onTitleChange = this.onTitleChange.bind(this);
this.onClickSave = this.onClickSave.bind(this);
this.onDropChange = this.onDropChange.bind(this);
}
onTitleChange (event) {
//console.log("event: ", event)
const course = this.state.course;
// console.log("course: ", course);
course.title = event.target.value;
this.setState({course: course});
}
onClickSave () {
this.props.dispatch(courseActions.createCourse(this.state.course));
}
courseRow(course, index) {
return <div key={index}>{course.title}</div>
}
onDropChange (eventKey) {
console.log("drop change: ", eventKey);
const drplist = this.state.drplist;
drplist.drpval = eventKey;
console.log('title2:', drplist.drpval);
}
render (title) {
let data = [1,2,3,4]
const makeList = function(x) {
return <ReactBootstrap.MenuItem eventKey={x}>{x}</ReactBootstrap.MenuItem>
}
console.log("title:", title)
return (
<div>
<h1>Courses</h1>
{this.props.courses.map(this.courseRow)}
<h2>Add Course</h2>
<input
type="text"
onChange={this.onTitleChange}
value={this.state.course.title} />
<input
type="submit"
value="save"
onClick={this.onClickSave} />
<ReactBootstrap.DropdownButton title="test drop" id="bg-vertical-1" onSelect={this.onDropChange}>{data.map(makeList)}</ReactBootstrap.DropdownButton>
</div>
);
}
}
function mapStateToProps(state, ownProps) {
return {
courses: state.courses
};
}
export default connect(mapStateToProps) (CoursesPage);
- - - -编辑 - - - -
我想我在哪里:
我使初始状态如下所示:
this.state = {
course: {title: ""},
drplist: {drpval: "Drop Down"}
};
然后,我将渲染部分更改为:
<ReactBootstrap.DropdownButton title={this.state.drplist.drpval} id="bg-vertical-1" onSelect={this.onDropChange}>{data.map(makeList)}</ReactBootstrap.DropdownButton>
但是title={this.state.drplist.drpval}
似乎没有反映出更新后的状态...
您需要正确设置/更新状态。 course
和drplist
都是对象。 因此,当发生这些对象的更新时,您需要“让React知道”更新,以便它知道需要重新呈现某些内容。 一个“ hack”是在console.log('title2:', drplist.drpval);
之后调用this.forceUpdate()
console.log('title2:', drplist.drpval);
。
但是,正确的做法是正确更新状态。 首先直接克隆您要更新的状态对象,然后使用this.setState
通知React有关更新,而不是直接操作对象值。 因此,将onDropChange
函数更改为。
console.log("drop change: ", eventKey);
//make a shallow-copy of the drplist object
let drplist = Object.assign({}, this.state.drplist);
drplist.drpval = eventKey;
console.log('title2:', drplist.drpval);
this.setState({drplist: drplist});
类似的错误存在于您的onTitleChange
您正在改变状态。 我强烈建议您阅读React的不变性 。
onTitleChange (event) {
const course = this.state.course;
this.setState({
course: {
...this.course,
title: event.target.value
}
});
}
确保在babel配置中启用了对象传播运算符插件 。 否则,您可以使用Object.assign 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.