Elm 组件和视图:什么时候应该使用 `Html msg` 以及什么时候应该使用 `Html Msg`

2024-04-15

我正在做一个项目,我和我的队友正在讨论哪种方法更好。

在我看来Html msg似乎更通用,所以我认为我们应该尽可能使用它,但除此之外我不能给他其他理由。

另外,我来自 React 和 Redux,对我来说看起来像是带有签名的组件Html Msg就是我们所说的Smart/Connected Components and Html msgDumb Components,我的这个假设正确吗?

你能告诉我什么时候应该使用每一种吗?

谢谢


将视图函数注释为返回Html msg意味着您没有将视图绑定到特定的Msg类型。因此它更加灵活,但也限制了您可以做的事情。

在编写不呈现特定于特定的任何代码的共享代码时,使用小写版本很有用Msg。例如,您可以标准化一些布局代码:

pageTitle : String -> Html msg
pageTitle title =
    h1 [ class "page-title" ] [ text title ]

上面的代码could return Html Msg但这会限制它共享它的能力,因为你会将它绑定到特定的Msg type.

现在,如果您正在编写能够生成特定事件的内容并将其绑定到Msg构造函数,然后你必须返回Html Msg:

type Msg = RollDice | Rolled Int

diceButton : String -> Html Msg
diceButton label =
    button [ class "fancy-btn", onClick RollDice ] [ text label ]

如果您尝试返回小写,则上述定义将无法编译Html msg.

如果我们停在那里,我可以看到这可能会与 React 中的智能组件与愚蠢组件的想法类似,因为小写版本似乎无法渲染会触发事件的 Html,但这种类比并不真正成立。假设您想要在系统范围内标准化按钮,但不想将其绑定到特定的按钮Msg。您可以通过接受以下参数使该函数更加通用Msg点击时触发。

fancyButton : String -> msg -> Html msg
fancyButton label msg =
    button [ class "fancy-btn", onClick msg ] [ text label ]

一般来说,如果您正在编写要在内部共享或作为外部包共享的代码,则可以通过使用小写版本来提供更大的灵活性Html msg。这样做,您仍然可以编写可以触发事件的 Html,就像fancyButton上面的例子,它只是意味着你将一些责任传递给调用函数,调用函数必须决定什么Msg进入。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elm 组件和视图:什么时候应该使用 `Html msg` 以及什么时候应该使用 `Html Msg` 的相关文章

  • ELM和RVFL两种网络的超详细介绍

    最近一直在跑程序 在看文章时注意到了这两种网络 ELM和RVFL 自己查阅资料做了简单的总结 希望在大家学习时帮助到大家 一 RVFL Random vector functional link network 首先明确一点 在进行分类的时
  • elm 生成随机数

    我想在 elm 中的两个值之间生成一个随机 int 像这样的东西 nb random 0 10 我已阅读该文档和多篇文章 最好的答案来自这个 stackoverflowpost gen Random int 0 10 seed0 Rando
  • 如何告诉 elm 外部 DOM 的变化

    我正在使用 elm 0 17 1 并尝试与 select2 javascript 库 版本 4 0 3 进行互操作 这是我的 Main elm port module Main exposing import Html exposing H
  • 在 Elm 中声明模块之外访问联合类型

    Given module 1 module Module1 exposing Message where type Message Test String Error Int module 2 module Module2 exposing
  • 使用 elm 并选择

    我尝试通过自定义示例来了解 elm 的工作原理 durationOption duration option value toString duration text toString duration view Model gt Html
  • Elm - 文本区域选择范围消失

    I implemented a
  • Elm 与 ClojureScript 相比如何?

    我已经到了这样的地步 使用 Backbone js 面向对象的 MVC 模式进行 GUI 编码变得非常复杂 并且正在考虑其他范例 MDV https github com Polymer TemplateBinding FRP http e
  • Redux - 一个与多个减速器

    我来自 Elm 社区 在 Elm 中 每个应用程序都有自己的视图 模型和状态 并且基本上采用与 redux 非常相似的方法来解决问题 不管怎样 我发现自己在多个减速器的想法中挣扎 在 Elm 中 我习惯为所有操作 消息 创建一个单独的文件
  • 用于带有数据的 Union 类型的 Elm JSON 解码器

    我的 json 看起来像这样 name providerWithVal value example 或者像这样 name provider2 or name provider3 我的 Elm 联合类型定义如下 type Provider P
  • 如何在 elm 中按索引获取列表项?

    我有一个清单 现在我想要第 n 项 在哈斯克尔我会使用 但我找不到它的榆树变体 Elm 添加了数组0 12 1 http elm lang org blog announce 0 12 1 elm 并且在 0 19 中对实现进行了大规模修改
  • 在 Elm 中解析嵌套 JSON

    我有这种情况 this is in post elm type alias Model img String text String source String date String comments Comments Model thi
  • 如何将 onClick 事件处理程序添加到 Elm 中的画布形状?

    是否可以添加 onClick 事件处理程序Graphics Collage square 我想知道点击的相对位置 在 Javascript 中 我可以做类似的事情this http jsbin com zikaxoguvu 1 edit h
  • Elm - 生成随时间变化的随机数列表

    我试图使一列随机数每秒发生变化 但我收到不同的错误消息 import Random main flow down asText Random range 0 100 every second asText Random range 0 10
  • 在 Elm 中,有没有办法合并联合类型? (出于模块化目的)

    从这三个声明开始 type SharedMsg SharedAction type Page1Msg Page1Action type Page2Msg Page2Action 我有办法获得相当于以下内容的方法吗 就像一种 合并 联合类型的
  • Angular.js 与 Elm 相比有何优缺点?

    我正在考虑在浏览器中进行一些反应式编程并比较 angular js http angularjs org http angularjs org 与榆树 http elm lang org http elm lang org 各自的相对好处
  • ELM QueryString 解析器无法编译

    我真的很想学习一些 ELM 但是我的思想在查询解析时崩溃了 我的想法是创建一个函数来按名称获取查询字符串值 例如 给定一个查询字符串 name Neuber像这样的函数getParam name 那会返回Neuber 但它在最基本的例子中失
  • “foldp”是否违反了 FP 的不可变状态原则?

    我正在学习 Elm七周内增加七种语言 http pragprog com book 7lang seven more languages in seven weeks 下面的例子让我很困惑 import Keyboard main lift
  • Elm 中的序列 Http.get

    下面我有一个button尝试加载远程内容 import Post exposing Post import Html exposing import Html Events exposing import Http import Json
  • Elm - 检查值的类型

    是否存在检查 Elm 中变量类型的函数 例如 重复 numberTwo 2 returnType numberTwo number String 这样做的动机是当你使用Signal map n 通常会出现这样的情况 并非所有要应用的函数的参
  • Elm 组件和视图:什么时候应该使用 `Html msg` 以及什么时候应该使用 `Html Msg`

    我正在做一个项目 我和我的队友正在讨论哪种方法更好 在我看来Html msg似乎更通用 所以我认为我们应该尽可能使用它 但除此之外我不能给他其他理由 另外 我来自 React 和 Redux 对我来说看起来像是带有签名的组件Html Msg

随机推荐

  • 使用python(谷歌应用程序引擎)获取上传文件的名称和扩展名

    我正在使用表单将文件上传到谷歌应用程序引擎并将它们存储在数据存储中 我还想存储原始文件名和扩展名以供演示之用 有没有办法从发布服务器端检索此数据 或者只能在客户端收集并作为单独的字段发送 例如http www tinyurl com 5jy
  • 使用已填充的模型添加非空且唯一的字段

    我的应用程序中有一个模型在带有一些条目的服务器中运行 我需要添加一个SlugField 对于该模型来说是唯一且非空的 这SlugField将根据trading name 我更改了模型以添加这个新字段并修改了保存方法 class Suppli
  • jqGrid treeGrid 捕获展开折叠事件

    我使用 jqGrid 来构建一些大树 现在我想记住cookie中展开和折叠的节点 所以我想捕捉展开和折叠事件 我在手册中找不到它 所以我用这种方式解决了 grid find div treeclick bind click function
  • PRY 或 IRB - 重新加载类并忘记已删除的功能

    如果您更改文件然后在 pry 或 irb 中重新加载它 它似乎会拾取您添加到该类中的任何新功能 但不会忘记您从该类中删除的旧功能 重现步骤 使用单一方法创建一个类 例如 say hello 打开 PRY 或 IRB 并且load my cl
  • 使用 $.html() 时如何提高渲染性能

    我正在研究骨干demo app https jsfiddle net o75r7fu9 8 显示推文列表 当我用不同的数据替换所有 推文 时 我使用以下命令清除列表 html render function item table html
  • 如何将powershell UTC日期时间对象转换为EST

    我收到了日期时间字符串 格式如下 2017 08 03T12 30 00 000Z 我需要能够将它们转换为 EST 我尝试过的每个函数都会抛出一个或另一个错误 通常是 String was not recognized as a valid
  • translate3d() 导致 jQuery 悬停/单击事件无法正确触发

    在分析不同 CSS 动画类型上的 jQuery 鼠标事件时 我注意到 translate3d 会导致悬停和其他事件无法正确触发 在一个基本示例中 我从右到左对块列表进行动画处理 翻转时 我将悬停的 LI 背景设置为绿色 注意 测试是为 we
  • 实时音高检测

    用于实时检测用户歌唱的音调FFT https stackoverflow com questions 1351381 fft problem returns random results and 自相关 https stackoverflo
  • 为什么不能使用“new”运算符创建泛型类型的实例?

    我发现了很多关于how克服这个限制 但没有说明为什么存在这个限制 除了this one https stackoverflow com questions 75175 create instance of generic type in j
  • 为什么我不应该为 React 和 babel 使用 CDN?

    当我学习 jQuery 和 Bootstrap 时 我们 我的学习 Web 框架的菜鸟同胞 被告知 CDN 有很多好处等等 现在我正在涉足 React Babel 我们被告知应该从我们的主机服务器下载文件并准备好一切 但我们仍然能够使用 C
  • int[] 数组和 int array[] 之间的区别

    最近一直在思考两种定义数组方式的区别 int array int array 有区别吗 它们在语义上是相同的 这int array 添加语法只是为了帮助 C 程序员习惯 java int array更可取 并且更不易混淆
  • 如何重构代码以在主线程上调用 AppDelegate?

    我最近开始将我的项目从 Swift 3 Xcode 迁移到 Swift 4 Xcode 我的应用程序在运行时崩溃 因为主线程清理程序允许访问UIApplication shared delegate仅在主线程上 导致启动时崩溃 我有以下代码
  • youtube 视频作为网站背景

    有没有办法将 youtube 视频嵌入到带有 html css 和 javascript 的网页背景中 并将实际网站内容放在顶部 如何 基本上 它应该是一个自动播放 静音的视频 但访问者可以调高音量 并且该网站应该在其之上运行良好 该网站很
  • 来自直播流的语音到文本[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 Java 应用程序 我想要转录的不是一个文件 而是一个由 Wowza 提供的实时流 rtmp
  • 如何定位除悬停在 div 上之外的同一类的所有 div?

    我有一组 div 都具有相同的类 如果可以使这更容易 它们不必具有相同的类 理想情况下 我想要的是 当用户将鼠标悬停在这些 div 之一上时 其他 div 每个都有背景图像 全部变成灰色 以将焦点放在当前悬停的 div 上 如果是悬停在上面
  • 在两个或多个窗口之间拖放 QDockWidget

    我想知道是否有人知道是否可以拖动QDockWidget http doc qt nokia com latest qdockwidget html从一个窗口到另一个窗口 我正在开发一个有很多窗口的应用程序 每个窗口都有特定的用途 我想使用
  • 使用 OpenXML 打开点文件

    我需要打开一个 DOT word 文档模板 文件 替换填充符并将其另存为文档文件 打开 DOT 文件时 我收到 文档文件已损坏 是否可以使用 OpenXML 处理 DOT 文件 UPDATE 我正在将 DOT 文件另存为 XML 手动使用
  • 如何在 emacs 中以 info 模式打开 *.info 文件?

    C x C f blah info以基础金属模式打开文件 我用过apropos并发现Info mode我认为这可能会从基本模式更改为信息模式 但这会引发 lisp 错误 如何在 emacs 中打开外部 第三方 info 文件 以便获得与查看
  • 在旋转排序数组中搜索数字

    给定一个可以旋转的排序数组 以最小的时间复杂度在其中找到一个元素 例如 数组内容可以是 8 1 2 3 4 5 假设您在其中搜索 8 该解决方案仍然适用于二分搜索 因为您需要将数组划分为要检查的两个部分 在排序数组中 您只需查看每个部分并确
  • Elm 组件和视图:什么时候应该使用 `Html msg` 以及什么时候应该使用 `Html Msg`

    我正在做一个项目 我和我的队友正在讨论哪种方法更好 在我看来Html msg似乎更通用 所以我认为我们应该尽可能使用它 但除此之外我不能给他其他理由 另外 我来自 React 和 Redux 对我来说看起来像是带有签名的组件Html Msg