【发布时间】:2020-06-26 14:35:40
【问题描述】:
我将主要使用 php 和 jquery 编写的项目的前端转移到 react 作为学习练习。到目前为止,它似乎让一切变得更加复杂,但我希望我能很快看到好处。现在,让自己熟悉一些比我正在使用的东西更流行的东西是件好事。但我离题了...
目前我正在翻译的一种特殊情况在 jquery 中感觉很简单,但我觉得我不得不在一堆繁琐或不推荐的解决方案之间进行选择,react,如dangerouslysetinnerhtml
用户可以输入自己的列表作为原始文本,应用程序使用正则表达式对其进行解析以突出显示数量和项目,如上图所示,以玫瑰色和绿色突出显示。新行被解析为列表元素,以 peach 突出显示。解析的数量可以使用范围输入进行缩放,如列表上方所示。示例 UI 显示了解析原始文本字符串后的示例。
以前 - jquery
当我使用 jquery 时,我将正则表达式匹配替换为包含 data 属性的 <span> 元素,以创建我可以定位的新元素。应用中的数量缩放功能现在可以使用数据属性随时引用列表项的原始数量。
例如 I need 10 cars 被解析为<li>I need <span class='highlight quantity' data-count='10'>10</span> <span class='highlight item' data-item='cars'>cars</span></li>
使用 jquery,每当拖动输入范围时,我只针对页面上具有 quantity 类的所有元素,引用它们的 data-count 并将跨度值替换为当前范围值乘以 data-count。这很好用。
现在 - 反应
我正在研究 react 组件。参考上面的插图,我有一个对话框组件(因为也会有其他对话框),一个对话框范围输入组件,一个列表组件和一个列表项组件。
和以前一样,当我拖动输入范围时,我希望页面上的数量发生变化以反映用户设置的新比例。拿起 react 后,我开始熟悉组件 states 和 props,并认为这些可以很好地解决我的问题。如果我有一个比例 state 我可以通过组件传递它,并且层次结构中的任何东西都可以引用它。据我了解,层次结构很重要,并且将状态保持在顶部很重要,以便可以“馈送”较低级别的组件,如果这是一种放置它的好方法的话。这似乎是最佳做法。
但我很难让它跳过篮球。是不是我理解错了?
两个不确定性
1
如果我正确理解了状态的层次结构,我最初是在 App() 函数中设置状态,如下所示:
function App() {
const [scaleValue, setScaleValue] = useState();
const handleScaleChange = (childData) => {
setScaleValue(childData);
}
return (
<React.Fragment>
/~~~/
<UserList rawstring={userText} scale={scaleValue} />
/~~~/
<Dialogs scale={scaleValue} setscale={setScaleValue} parentCallback={handleScaleChange}/>
</React.Fragment>
);
}
但我必须使用回调函数来更改状态,因为我正在使用的对话框范围嵌套在组件中的几个级别 - 将其传递回父 App() 函数中的状态,然后返回到所有使用 props 的嵌套组件。在 jquery 中只定位具有匹配类名的元素感觉要容易得多,而且我还没有看到让组件使用状态的优势。我认为能够针对具有数量状态的列表项组件在 React 中具有更明显的优势。
2
也许是让我不知道如何继续进行的主要事情。在 jquery 中,当我将用户提供的原始字符串解析为可以以特定类为目标的 html 时,我只是使用了一些正则表达式函数来返回可以插入到 中的 html dom。 html 的示例与前面的示例相同:
I need 10 cars被解析为<li>I need <span class='highlight quantity' data-count='10'>10</span> <span class='highlight item' data-item='cars'>cars</span></li>
使用 react,我可以将相同的字符串解析为相同的 html,但我不知道如何从逻辑上处理它?如果我返回并插入它,它将被视为原始文本并在页面上呈现 html 标签。我可以使用dangerouslysetinnerhtml,它显示得很好,但我已经清楚地知道这是非常不鼓励的信息。我想使用最佳做法。
事实上,我可能不想返回包装在可定位类中的数量。我收集到我希望能够将状态分配给列表项组件。我完全不知道什么是最好的方法(逻辑上)用反应来做到这一点。我可以从正则表达式解析中返回一个数组,但与将匹配的子字符串替换为自身的包装版本相比,这感觉不必要地复杂。
在这一点上,我觉得我可能接近翻译错误(或者我对使用组件系统和状态的理解),因为这感觉比我使用的 jquery 方法更复杂。
【问题讨论】:
标签: javascript jquery reactjs