- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在单击表标题时对表行进行排序。我的代码正在处理常规 html/javascript 片段 here 。但是它不能作为 React 方法工作。我认为问题出在.querySelectorAll()
方法的使用上和.parentNode
。我已经替换了方法.getElementById()
与 this.refs.rows
通过添加引用到 <tbody>
但我不认为一个引用可以指向多个元素(以获取所有 <td>
元素)。我正在寻找一种类似的方法来替换这两种似乎不起作用的方法。或者这完全是另一个问题?
编辑:按照评论中的要求添加了整个 React 组件
import React from "react";
import { Row, Col, Table } from "reactstrap";
export class ComparePlayers extends React.Component {
constructor(props) {
super(props);
this.state = {
players: [],
};
}
componentDidMount() {
fetch("/players")
.then((response) => response.json())
.then((state) => {
this.setState({ players: state });
});
}
handleSort(n) {
let rows, switching, i, x, y, shouldSwitch;
switching = true;
while (switching) {
switching = false;
rows = this.refs.rows; /* replaced document.getElementById("myTable").rows; */
for (i = 0; i < rows.length; i++) {
shouldSwitch = false;
x = rows[i].querySelectorAll("td")[n]; // how to replace?
y = rows[i + 1].querySelectorAll("td")[n]; // how to replace?
if (!isNaN(Number(x.innerHTML))) {
if (Number(x.innerHTML) > Number(y.innerHTML)) {
shouldSwitch = true;
break;
}
} else {
if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
shouldSwitch = true;
break;
}
}
}
if (shouldSwitch) {
rows[i].parentNode.insertBefore(rows[i + 1], rows[i]); // how to replace?
switching = true;
}
}
}
render() {
return (
<Row>
<Col>
<Table bordered>
<thead>
<tr>
{this.state.players.length > 0 &&
Object.keys(this.state.players[0]).map((key, id) => (
<th
key={"header_" + key}
onClick={() => this.handleSort(id)}
>
{key.toUpperCase()}
</th>
))}
</tr>
</thead>
<tbody ref="rows">
{this.state.players.length > 0 &&
this.state.players.map((player, id) => {
return (
<tr key={"row" + id}>
{Object.values(player).map((value) => (
<td key={"table_value_" + value}>{value}</td>
))}
</tr>
);
})}
</tbody>
</Table>
</Col>
</Row>
);
}
}
<小时/>
更新和解决方案:
我使用了 @MahdyAslamy 的答案并适应了我的状态,即对象数组。我用过this tutorial根据属性值对对象数组进行排序。这是最终的代码:
handleSort(el) {
const compareValues = (key) => {
return function innerSort(a, b) {
if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) {
// property doesn't exist on either object
return 0;
}
const varA = typeof a[key] === "string" ? a[key].toUpperCase() : a[key];
const varB = typeof b[key] === "string" ? b[key].toUpperCase() : b[key];
let comparison = 0;
if (varA > varB) {
comparison = 1;
} else if (varA < varB) {
comparison = -1;
}
return comparison;
};
};
const sorted = this.state.players.sort(compareValues(el));
this.setState({
players: sorted
});
}
最佳答案
通过改变 dom 上的标签位置来对表进行排序并不是一个好方法。 React 建议使用状态和通常的组件生命周期来改变外观。
例如:
class Game extends React.Component {
constructor(props) {
super(props);
this.state = {
list: [5,6,8,9,6,5,4,22,4]
}
}
render() {
return (
<div className="game">
<button onClick={() => this.setState({ list: this.state.list.sort() })}>sort</button>
<ul>
{this.state.list.map(el => <li>{el}</li>)}
</ul>
</div>
);
}
}
// ========================================
ReactDOM.render(
<Game />,
document.getElementById('root')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>
仅对列表进行排序,然后在渲染时显示排序列表。
关于javascript - 通过多个元素的单个引用来 react : How to replace . querySelectorAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61020811/
我有以下内容: var searchSuggestionsItems = document.querySelectorAll("#search-user-results .live-search-re
我正在尝试查找具有以下内容的元素: doc.querySelectorAll('#divContentList article'); 它运行良好,但另一位开发人员告诉我我应该写: doc.queryS
尝试在错误控制台中执行这 2 个代码块: 第一个。输出节点列表。 var selector = "*[data-type=day][data-day='23']"; var a = document.
这是我的 JavaScript 代码: function answer(){ var list = document.querySelectorAll("#fish"); list[1].onclic
假设我有: ... ... ... ... ... ... ... 如何选择 元素,但仅限于 testimonials-wrapper 内的元素 尝试过:d
我创建了一个表,我们将其命名为 RPT_ACCOUNTS 代码|描述|类型01|银行|BA02|税|TA 当我从数据表中提取信息时,我会在 html 中直观地创建表格 row.dataset.rpt_
document.querySelectorAll('#salary-min, #salary-max').addEventListener('input', event => event.tar
这个问题已经有答案了: What do querySelectorAll and getElementsBy* methods return? (12 个回答) 已关闭 2 年前。 javaScrip
为了简单起见,我有以下 html,它不是我编写的,我无法控制。 我正在尝试为我们的职员编写一个脚本,该脚本必须将数据输入到此 Web 界面,以便她可以将数据从 Excel 复制并粘贴到 Web
我的代码有问题。现在,如果我单击第一个元素,所有元素将变为红色,如果我第二次单击它们将变为绿色。我想为 fa-heart 类的每个元素设置两个独立的事件。我会更好地解释:如果我第一次点击第一个元素 D
我已经创建了简单的 html 表单,我想使用 javascript 为输入字段标签设置动画。我使用 querySellectorAll 方法来识别对象,并使用控制台记录 querySelectorAl
我目前正在尝试适应this demo当您单击应用了相同类的链接时,用于页面转换。 我不确定如何在使用 querySelectorAll 后为具有相同类的所有元素调整以下代码。您认为应该进行哪些调整才能
我目前正在尝试适应this demo当您单击应用了相同类别的链接时,可以实现页面转换。目前,在 @ourmaninamsterdam 的推荐 here 后,我有以下代码:但我似乎无法让它发挥作用。您对
var arr = [].slice.call(document.querySelectorAll("a[href*='pricing']")); 返回一个长度为6的数组。 var arr = [].
我在 querySelectorAll 方面遇到问题。 这是我的代码: $(window).load( function() { // Add animations
在 JavaScript 中使用 :checked 选择器 document.querySelectorAll() 时,我发现存在不一致的行为。当 :checked 选择器用于复选框或单选按钮时,它不
我有一个表单,其中有多个选择框和带有类似名称的数组的输入。所以我有多个名称为 personroom[] 的选择框。我想用这个得到这些 var personroom=document.querySel
不确定这是否是导致我的项目出现错误的原因。 所以我有一堆具有相同类的 div,我通过选择它们 var CampaignInfo = document.querySelectorAll(".campai
假设我有以下标记... 无论如何,我可以使用 querySelectorAll 选择它们吗? 我尝试过 document.querySelectorAll([data-namespace-*])
我想使用 querySelectorAll 获取页面上多个下拉列表的选定值,然后将它们打印在页面上的其他位置。 我正在努力寻找正确的方法来执行此操作,因为它们都有不同的名称(“dropDown[0]”
我是一名优秀的程序员,十分优秀!