问题描述
我正在尝试为我的reactjs项目构建一个面包屑组件,并且不断收到public class OverallCrewMemberAdapter extends Baseexpandablelistadapter {
private Context _context;
private List<String> _listDataHeader; // header titles
DrivesListFragment drivesListFragment;
// child data in format of header title,child title
private HashMap<String,List<CrewMember>> _listDataChild;
public OverallCrewMemberAdapter(Context context,List<String> listDataHeader,HashMap<String,List<CrewMember>> listChildData,DrivesListFragment drivesListFragment) {
this._context = context;
this._listDataHeader = listDataHeader;
this._listDataChild = listChildData;
this.drivesListFragment = drivesListFragment;
}
@Override
public Object getChild(int groupPosition,int childPosititon) {
return this._listDataChild.get(this._listDataHeader.get(groupPosition)).get(childPosititon);
}
@Override
public long getChildId(int groupPosition,int childPosition) {
return childPosition;
}
@Override
public View getChildView(int groupPosition,final int childPosition,boolean isLastChild,View convertView,ViewGroup parent) {
// The child views in each row.
CheckBox driverChild;
CheckBox memberChild;
CheckBox bonusChild;
final Spinner malusChild;
final CrewMember crewMember = (CrewMember) getChild(groupPosition,childPosition);
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) this._context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.activity_overall_drives_view_item,parent,false);
}
TextView txtListChild = (TextView) convertView
.findViewById(R.id.contact);
txtListChild.setText(crewMember.getContactName());
malusChild = (Spinner) convertView.findViewById(R.id.numberOfMalus);
driverChild = (CheckBox) convertView.findViewById(R.id.driver);
memberChild = (CheckBox) convertView.findViewById(R.id.member);
bonusChild = (CheckBox) convertView.findViewById(R.id.bonus);
List<String> list = new ArrayList<String>();
list.add("0");
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(_context,android.R.layout.simple_spinner_item,list);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
malusChild.setAdapter(adapter);
driverChild.setChecked(crewMember.isDriver());
memberChild.setChecked(crewMember.isMember());
bonusChild.setChecked(crewMember.hasBonus());
malusChild.setSelection(crewMember.getNumberOfMalus());
System.out.println("CrewMembers member name ----> " + crewMember.getContactName());
System.out.println("isLastChild :" + isLastChild);
driverChild.setClickable(false);
memberChild.setClickable(false);
bonusChild.setClickable(false);
malusChild.setEnabled(false);
convertView.setVisibility(View.VISIBLE);
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
return this._listDataChild.get(this._listDataHeader.get(groupPosition)).size();
}
@Override
public Object getGroup(int groupPosition) {
return this._listDataHeader.get(groupPosition);
}
@Override
public int getGroupCount() {
return this._listDataHeader.size();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public View getGroupView(int groupPosition,boolean isExpanded,ViewGroup parent) {
String headerTitle = (String) getGroup(groupPosition);
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) this._context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.daily_item,null);
}
TextView date = (TextView) convertView
.findViewById(R.id.dailyText);
date.setTypeface(null,Typeface.BOLD);
date.setTextColor(Color.RED);
date.setText(headerTitle);
return convertView;
}
@Override
public void onGroupExpanded (int groupPosition){
String data = (String) getGroup(groupPosition);
System.out.println("data selezionata : " + data);
this.drivesListFragment.updateButtons(data);
// View view = inflater.inflate(R.layout.activity_overall_drives_view,container,false);
}
@Override
public boolean hasstableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition,int childPosition) {
return true;
}
的错误。我的Too many re-renders
看起来像这样:
App.jsx
<div className="page-subheader">
<Breadcrumbs />
</div>
看起来像这样:
Routes.jsx
然后export default [
{
name: 'Department1',abbrev: 'D1',icon: "fas fa-bullhorn",rootpath: '/dept1',paths: [
{
path: "/dept1",name: "Dashboard",Component: Dashboard,icon: "icon-Gaugage",showWelcome: true,crumbs: [
{name: 'Home',path: '/'},{name: 'Department1',path: '/dept1'},],},{
path: "/dept1/mailroom",name: "Mailroom",Component: Mailroom,icon: "fas fa-envelope",showWelcome: false,{name: 'Campaigns',path: '/dept1/mailoom'},{
path: "/dept1/people",name: "People",Component: People,icon: "fas fa-users",{name: 'People',path: '/dept1/people'},{
path: "/dept1/tools",name: "Tools",Component: Tools,icon: "fas fa-chart-bar",{name: 'Tools',path: '/dept1/tools'},}
],{
name: 'Department2',icon: "fas fa-building",abbrev: 'D2',rootpath: '/dept2',paths: [],{
name: 'Deaprtment3',icon: "fas fa-users-cog",abbrev: 'D3',rootpath: '/dept3',}
];
看起来像
Breadcrumbs.jsx
我是新来的反应者,但这一切看起来都很简单-我不明白为什么它会一遍又一遍地重新渲染面包屑组件。
解决方法
React hooks是“正常”的JS函数(要理解这一点很重要)。每次状态更改时,该函数都会被react调用。
问题:
面包屑组件 是“反应钩子”。该函数从上到下执行,setCurrentRouteObject(routepath)
更改状态。由于状态发生变化,因此再次调用了面包屑,因此状态又发生了变化,因此再次调用了面包屑,...
解决方案:
您应该使用useEffect()
来更改状态,具体取决于其他状态。
useEffect( function(){
// ...
setCurrentRouteObject(/* ... */);
},[ currentPath ] );
您在这里使用Routes
的方式似乎有问题,我不太明白会发生什么。您可能想看看.find()方法。