React如何准确地存储和响应更改状态?

时间:2017-02-03 17:20:05

标签: reactjs

我正在抓一个使用React作为前端的网站。到目前为止,似乎我必须使用他们的搜索表单才能到达结果页面。

问题是,每次刷新页面时,网站都会从下拉列表(state)中清除搜索表单中的所选选项,因此它会使抓取速度明显变慢。我知道它按预期工作,但如果有一种方法我可以直接操纵状态,那么它可以加速我的刮刀,而不是从小按钮重新选择所有选择。

我认为它根本不会使用任何类型的持久存储本地存储,因为每个选择都不会,否则表单可能不会刷新时清除。

我可以看到表单的年份选项始终存在于data-属性(data-years=["2017", "2016", ...])中,但仅存在多年。当选择一年(或下拉列表中的任何选项)时,会使用<input type="hidden" name="year" value="2017">等值填充隐藏字段。

这就是React用于临时存储(又名。) - 隐藏字段吗?

对于我的问题的第二部分,当状态发生变化时会触发什么类型的事件?我怎么能手动触发它?例如,当我选择一年时,我希望表单能够为我提供下一个下拉菜单的选项 - 给出年份。

1 个答案:

答案 0 :(得分:3)

React根本不使用DOM来维护状态。您提供的示例只是一个写得不好的React应用程序。通常情况下,所有内容都将保留在内存中(关闭代码,因此窗口/全局中没有任何内容),React将根据需要更新DOM。 :)

这意味着我不认为你能够从外部读取/检测React的内在状态变化。交互式抓取应该像使用该页面的用户一样工作,没有任何暗示它真正使用的技术。

根据您用于抓取的技术,您确实可以模拟或生成真实的DOM事件。当我们需要使用无处不在的Selenium服务器为React应用程序编写一些端到端测试时,我们通常必须在按钮,选项等上手动click并留出时间让React应用程序做出相应的反应并执行其操作魔法(比如获取更多数据和更新页面),然后读取文档内容以验证一切正常。它基本上是“刮擦”所需的输出来验证你的测试断言。

如果您只是在抓取静态页面(卷曲样式:获取HTML并使用原始HTML响应按照您的方式工作),我认为您无法处理Javascript表单。你需要你的刮刀是互动的。

除了上面提到的Selenium / WebDriver之外,像PhantomJS这样的东西可能会有所帮助。