【发布时间】:2018-06-08 22:27:45
【问题描述】:
我想保留当前点击列表项的背景颜色和颜色。我使用以下代码通过 CSS 突出显示它:
.segmentsList:hover {
background: black;
color: white;
cursor: pointer;
}
我已尝试将 onClickFunction 附加到 li 的 onClick 事件中,如下所示:
import React, {Component} from 'react';
import Link from "react-router-dom/es/Link";
import {Button} from 'reactstrap';
import cabeza from '../atlas/json/cabeza.json';
const parte = getParameterByName('parte') || 0;
export default class SegmentsList extends Component {
onClickFunction(e) {
console.log(e);
// e.target.element.class="newBlackColor";
}
render() {
console.log(cabeza[parte].etiquetas);
readTextFile(cabeza[parte].etiquetas);
function readTextFile(url) {
const rawFile = new XMLHttpRequest();
rawFile.open("GET", url, false);
rawFile.overrideMimeType('text/xml; charset=iso-8859-1');
rawFile.onreadystatechange = function () {
if (rawFile.readyState === 4) {
const text = rawFile.responseText;
// console.log(rawFile.responseText);
const lines = splitLines(text);
// console.log(lines);
const words = splitWords(lines[0]);
// console.log(words);
window.words = words;
}
return;
function splitLines(text) {
return text.split('\n');
}
function splitWords(line) {
return line.split('" "').slice(1);
}
};
rawFile.send();
}
return (
<div>
<ol>
{window.words.map((word, index) =>
<li
onClick={this.onClickFunction}
className='segmentsList'
key={index}>{word}</li>
)}
</ol>
<Button
color='primary'
className='mt-3 ml-3'
>
<Link to='/'/>
Volver a la portada
</Button>
</div>
);
}
}
function getParameterByName(name, url) {
if (!url) url = window.location.href;
name = name.replace(/[\[\]]/g, "\\$&");
var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, " "));
}
当我点击列表项时,控制台会说:
Uncaught TypeError: Cannot set property 'class' of undefined
并检查事件对象,我们发现目标为空:
target:null
我做错了什么?
我也读过:
CSS Change List Item Background Color with Class
How to give a different color to a selected list item with CSS?
Highlight item onClick - React.js
编辑:
我想高亮被点击的那个,并去掉前一个被点击的高亮。
我已经写了一个方法来高亮列表元素并保持高亮直到你再次点击它:
SegmentsList.js
import React, {Component} from 'react';
import Link from "react-router-dom/es/Link";
import {Button} from 'reactstrap';
import cabeza from '../atlas/json/cabeza.json';
import SegmentsListItem from "./SegmentsListItem";
const parte = getParameterByName('parte') || 0;
export default class SegmentsList extends Component {
constructor(props) {
super(props);
}
render() {
console.log(cabeza[parte].etiquetas);
readTextFile(cabeza[parte].etiquetas);
function readTextFile(url) {
const rawFile = new XMLHttpRequest();
rawFile.open("GET", url, false);
rawFile.overrideMimeType('text/xml; charset=iso-8859-1');
rawFile.onreadystatechange = function () {
if (rawFile.readyState === 4) {
const text = rawFile.responseText;
// console.log(rawFile.responseText);
const lines = splitLines(text);
// console.log(lines);
const words = splitWords(lines[0]);
// console.log(words);
window.words = words;
}
return;
function splitLines(text) {
return text.split('\n');
}
function splitWords(line) {
return line.split('" "').slice(1);
}
};
rawFile.send();
}
return (
<div>
<ol>
{window.words.map((word, index) =>
<SegmentsListItem word={word} key={index}/>
)}
</ol>
<Button
color='primary'
className='mt-3 ml-3'
>
<Link to='/'/>
Volver a la portada
</Button>
</div>
);
}
}
function getParameterByName(name, url) {
if (!url) url = window.location.href;
name = name.replace(/[\[\]]/g, "\\$&");
var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, " "));
}
SegmentsListItem.js
import React, {Component} from 'react';
class SegmentsListItem extends Component {
constructor(props) {
super(props);
this.state = {highlighted: false};
}
highlight = (e) => {
console.log(e.target.className);
if (!this.state.highlighted) {
console.log('highlight');
e.target.className = 'segmentsListSelected';
} else {
console.log('remove highlight');
e.target.className = 'segmentsList';
}
this.setState({highlighted: !this.state.highlighted})
};
render() {
return (
<li
onClick={this.highlight}
className='segmentsList'
key={this.props.index}>{this.props.word}</li>
);
};
}
export default SegmentsListItem;
感谢您的帮助。
【问题讨论】:
-
我最初提交了一个答案,但这里错误太多。您在这里没有正确使用 react,这是一个更大的问题。
-
您好,只是为了澄清一下您想要保持列表项突出显示吗?我同意 Deadron 的观点,你没有使用 react 来实现它的目的。我会使用内联样式并使用组件状态设置颜色。如果你今晚还没有弄清楚,我会用一个工作样本来回答它。
标签: javascript css reactjs