如果 React 中不存在 JSON 键,如何隐藏 HTML 元素
How to hide an the HTML element if a JSON key doesn't exist in React
我正在尝试根据要导入的数据中是否存在 JSON 键来隐藏或显示 HTML 元素。如果该键存在,我希望显示我放入该对象的元素 ID。如果键不存在,我想隐藏相同的元素 ID。我正在使用 React,但不确定它是否属于 componentDidMount 或常规函数。我是新手,所以如果我不小心遗漏了重要的代码或写了蹩脚的东西,我深表歉意。
我的componentDidMount
代码:
componentDidMount = () => {
// Need to hide an the HTML element if the json key doesn't exist in the object
//check the JSON object for the key "workExamples"
if (typeof props.workItemData.workExamples === "undefined") {
console.log("it did not find the json key");
// Change element styling to hidden
document.getElementById("work-examples").style.visibility = "hidden";
} else {
return;
}
};
我的HTML:
<span id="work-examples" className="work-examples">
<a href={props.workItemData.workExamples}>Work Examples</a>
</span>
我假设我不需要 post 我的 JSON 对象。我有一些;只有一个有 workExamples
键。我正在使用 .map()
列出对象。
使用上面的代码,它不会隐藏列表中没有键的 JSON 对象的元素。希望这一切都有意义。感谢任何帮助。
如果您只是获取道具并可能输出它,您可以保持简单,只需在变量中命名您需要的内容即可。
render() {
let conditionalElement = null;
if(props.workItemData.workExamples) {
conditionalElement = (
<span id="work-examples" className="work-examples">
<a href={props.workItemData.workExamples}>Work Examples</a>
</span>
);
}
return (
<div>
{conditionalElement}
</div>
);
}
这将允许你有一个 null 值,如果需要可以将其注入 JSX(不会产生任何东西),然后检查 prop 是否存在,然后用你的 JSX 替换 null 值。
此外,是的,使用标准的 componentDidMount() {} 函数语法和 typeof 是不必要的。
正如卢克在评论中指出的那样,
the logic for whether or not to render should live in render
这里的其他答案已经涵盖了它的机制,所以我不会一一赘述。
其他几点:
您正在尝试使用箭头函数来定义标准 React 函数 componentDidMount
,并且基于快速的本地测试,我认为 React 无法理解这一点。与传统的 componentDidMount() { /* do stuff here */ }
语法相比,您似乎没有从中获得任何特别的好处,所以我会改用后者。
您正在尝试检查您的 JSON 是否包含
的密钥
typeof props.workItemData.workExamples === "undefined"
但我认为 typeof
没有必要;您可以直接检查密钥是否存在:
if(props.workItemData.workExamples) { /* do stuff */ }
最后,在您的 HTML 行
<a href={props.workItemData.workExamples}>Work Examples</a>
试图将 href
的值设置为 JavaScript 中的值(花括号中的内容)。这对 JSX 有效,因为您使用的是 React,所以这是有道理的,但不是纯粹的 HTML。但是由于页面正在加载并且只是没有正确处理逻辑的某个部分,我假设你只是指你的 JSX 中的 HTML-like 东西(一个 something.js
文件)而不是字面意思HTML 文件。
试试这个
render(){
return props.workItemData.workExamples && (
<span id="work-examples" className="work-examples">
<a href={props.workItemData.workExamples}>Work Examples</a>
</span>)
}
您 post 编辑的代码没有任何意义。您应该阅读 React 及其工作原理。您永远不需要 DOM-select-by-ID 一个 HTML 元素,该元素由 React 组件从该 React 组件中呈现。相反,您只需让 React 组件的渲染函数检查您的条件,然后相应地渲染 HTML。
除非实际上在这里,否则你甚至不需要这样做,因为如果你按照我认为的方式使用地图(你没有 post 你的数据,所以很难说),那么您只需为数组中的每个项目生成一个 HTML 元素。所以如果它不在数组中,它就不会 map()。
render() {
let workItems = this.props.workItemData ? this.props.workItemData.map((item) =>
<span id={Object.keys(item)[0]} className={Object.keys(item)[0]}>
<a href={item[Object.keys(item)[0]]}>{Object.keys(item)[0]}</a>
</span>
) : '';
return (
<div>
{workItems}
</div>
);
我会在创建相应组件之前删除没有密钥的对象。类似于:
render() {
return (
<div>
{
Object.keys(workItems)
.filter(item => item.workExamples)
.map(item => <YourComponent {...item} />)
}
</div>
)
}
在 React 中我想在映射后只显示现有元素,所以在列表元素中我添加了 CSS 逻辑:
render() {
return (
<div>
{
data.map ((item) => {
return (<div>
<li>{item.answer1}</li>
<li>{item.answer2}</li>
<li>{item.answer3}</li>
<li style = {{display: item.answer4 ? 'block' : 'none'}}>
{item.answer4}</li>
<li style = {{display: item.answer5 ? 'block' : 'none'}}>
{item.answer5}</li>
<li style = {{display: item.answer6 ? 'block' : 'none'}}>
{item.answer6}</li>
)
)
}
)
}
我正在尝试根据要导入的数据中是否存在 JSON 键来隐藏或显示 HTML 元素。如果该键存在,我希望显示我放入该对象的元素 ID。如果键不存在,我想隐藏相同的元素 ID。我正在使用 React,但不确定它是否属于 componentDidMount 或常规函数。我是新手,所以如果我不小心遗漏了重要的代码或写了蹩脚的东西,我深表歉意。
我的componentDidMount
代码:
componentDidMount = () => {
// Need to hide an the HTML element if the json key doesn't exist in the object
//check the JSON object for the key "workExamples"
if (typeof props.workItemData.workExamples === "undefined") {
console.log("it did not find the json key");
// Change element styling to hidden
document.getElementById("work-examples").style.visibility = "hidden";
} else {
return;
}
};
我的HTML:
<span id="work-examples" className="work-examples">
<a href={props.workItemData.workExamples}>Work Examples</a>
</span>
我假设我不需要 post 我的 JSON 对象。我有一些;只有一个有 workExamples
键。我正在使用 .map()
列出对象。
使用上面的代码,它不会隐藏列表中没有键的 JSON 对象的元素。希望这一切都有意义。感谢任何帮助。
如果您只是获取道具并可能输出它,您可以保持简单,只需在变量中命名您需要的内容即可。
render() {
let conditionalElement = null;
if(props.workItemData.workExamples) {
conditionalElement = (
<span id="work-examples" className="work-examples">
<a href={props.workItemData.workExamples}>Work Examples</a>
</span>
);
}
return (
<div>
{conditionalElement}
</div>
);
}
这将允许你有一个 null 值,如果需要可以将其注入 JSX(不会产生任何东西),然后检查 prop 是否存在,然后用你的 JSX 替换 null 值。
此外,是的,使用标准的 componentDidMount() {} 函数语法和 typeof 是不必要的。
正如卢克在评论中指出的那样,
the logic for whether or not to render should live in
render
这里的其他答案已经涵盖了它的机制,所以我不会一一赘述。
其他几点:
您正在尝试使用箭头函数来定义标准 React 函数 componentDidMount
,并且基于快速的本地测试,我认为 React 无法理解这一点。与传统的 componentDidMount() { /* do stuff here */ }
语法相比,您似乎没有从中获得任何特别的好处,所以我会改用后者。
您正在尝试检查您的 JSON 是否包含
的密钥typeof props.workItemData.workExamples === "undefined"
但我认为 typeof
没有必要;您可以直接检查密钥是否存在:
if(props.workItemData.workExamples) { /* do stuff */ }
最后,在您的 HTML 行
<a href={props.workItemData.workExamples}>Work Examples</a>
试图将 href
的值设置为 JavaScript 中的值(花括号中的内容)。这对 JSX 有效,因为您使用的是 React,所以这是有道理的,但不是纯粹的 HTML。但是由于页面正在加载并且只是没有正确处理逻辑的某个部分,我假设你只是指你的 JSX 中的 HTML-like 东西(一个 something.js
文件)而不是字面意思HTML 文件。
试试这个
render(){
return props.workItemData.workExamples && (
<span id="work-examples" className="work-examples">
<a href={props.workItemData.workExamples}>Work Examples</a>
</span>)
}
您 post 编辑的代码没有任何意义。您应该阅读 React 及其工作原理。您永远不需要 DOM-select-by-ID 一个 HTML 元素,该元素由 React 组件从该 React 组件中呈现。相反,您只需让 React 组件的渲染函数检查您的条件,然后相应地渲染 HTML。
除非实际上在这里,否则你甚至不需要这样做,因为如果你按照我认为的方式使用地图(你没有 post 你的数据,所以很难说),那么您只需为数组中的每个项目生成一个 HTML 元素。所以如果它不在数组中,它就不会 map()。
render() {
let workItems = this.props.workItemData ? this.props.workItemData.map((item) =>
<span id={Object.keys(item)[0]} className={Object.keys(item)[0]}>
<a href={item[Object.keys(item)[0]]}>{Object.keys(item)[0]}</a>
</span>
) : '';
return (
<div>
{workItems}
</div>
);
我会在创建相应组件之前删除没有密钥的对象。类似于:
render() {
return (
<div>
{
Object.keys(workItems)
.filter(item => item.workExamples)
.map(item => <YourComponent {...item} />)
}
</div>
)
}
在 React 中我想在映射后只显示现有元素,所以在列表元素中我添加了 CSS 逻辑:
render() {
return (
<div>
{
data.map ((item) => {
return (<div>
<li>{item.answer1}</li>
<li>{item.answer2}</li>
<li>{item.answer3}</li>
<li style = {{display: item.answer4 ? 'block' : 'none'}}>
{item.answer4}</li>
<li style = {{display: item.answer5 ? 'block' : 'none'}}>
{item.answer5}</li>
<li style = {{display: item.answer6 ? 'block' : 'none'}}>
{item.answer6}</li>
) ) } ) }