我已经检查了有关重新渲染的不同主题的先前答案,但是找不到解决此问题的正确方法。 我试图在选择框上触发onChange事件后重新呈现组件。
我有一个包含5个用户的用户列表,并将其分为性别数组。 所以我有一个男性阵列和一个女性阵列。我正在尝试在onChange事件之后显示所选的性别用户列表。
我试图在组件中使用'key'attr,但是它不起作用。
这是我的UserList容器:
import React, { Component } from "react";
import ReactDOM from "react-dom";
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import List from '../components/List.jsx'
class UserList extends Component {
constructor(props) {
super(props);
}
renderUser = (toMap) => {
console.log(toMap);
return (
<List key = {toMap.length} users = {toMap}/>
);
}
renderSelect = () => {
return (
<select id="gender" onChange={this.handleChange}>
<option value="select">Select a gender</option>
<option value="males">Males</option>
<option value="females">Females</option>
</select>
);
}
handleChange = (e) => {
const {userList,males,females} = this.props;
const gender = e.target.value;
if(gender == 'males'){
return this.renderUser(males);
}else if(gender == 'females'){
return this.renderUser(females);
}
return this.renderUser(userList);
}
render() {
const {isLoading,error,userList} = this.props;
return (
<div>
{this.renderSelect()}
<ul>
{this.renderUser(userList)}
</ul>
</div>
);
}
}
export default connect(mapStateToProps)(UserList);
这是我的列表组件:
import React from 'react';
const List = ({users}) => (
<ul>
{users.map( (user,index) => (
<li key = {index} >{user.email}</li>
))}
</ul>
);
export default List;
当我在handleChange中检查控制台时,道具(用户)正确通过,但视觉效果不佳。
答案 0 :(得分:3)
您应使用state / setState作为在react上触发渲染的一种方法。
setState()使更改进入组件状态,并告知React该组件及其子级需要使用更新后的状态重新呈现。
这里的主要思想是在状态下存储性别值,因为我们希望在更改此值时进行渲染
在构造器上添加初始状态
constructor(props) {
super(props);
this.state = {
gender: []
}
}
setState()
更新onChange事件。此功能将异步通知有关重新渲染的需求。您需要重构一下逻辑,以仅通过更新状态来清理更改处理程序。请记住,setState是异步的,可能会引起误解。
handleChange = (e) => {
setState({gender: e.target.value});
}
最终版本应如下所示:
import React, { Component } from "react";
import ReactDOM from "react-dom";
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import List from '../components/List.jsx'
class UserList extends Component {
constructor(props) {
super(props);
this.state = { gender: null };
}
renderUser = (toMap) => {
return (
<List
key = {toMap.length}
users = {toMap.filter(user => this.state.gender ? user.gender === this.state.gender : true)}/>
);
}
renderSelect = () => {
return (
<select id="gender" onChange={this.handleChange}>
<option value="select">Select a gender</option>
<option value="males">Males</option>
<option value="females">Females</option>
</select>
);
}
handleChange = (e) => {
this.setState({ gender: e.target.value})
}
render() {
const {isLoading,error,userList} = this.props;
return (
<div>
{ this.renderSelect() }
<ul>
{ this.renderUser(userList) }
</ul>
</div>
);
}
}
renderUser()
将根据所选性别执行filter
。无需存储男性和女性,因为在大多数情况下,性能应该很好。
答案 1 :(得分:2)
这是您的代码的有效示例:https://codesandbox.io/s/new-wkgu6
您不会在任何地方设置状态,因为哪个组件不会再次呈现
setState()将始终导致重新渲染,除非 shouldComponentUpdate()返回false。
有关setState api的更多信息,请参见