reactjs - 模型属性改变时调用组件方法
问题描述
在我的带有 Elmish 的 Fable 应用程序中,我有一个使用react- slick 的视图和一个应该能够在单击时更改幻灯片编号的按钮:
Fable.Import.Slick.slider
[ InitialSlide model.SlideNumber
AfterChange (SlideTo >> dispatch) ]
children
Button.button
[ Button.OnClick (fun _ev -> dispatch (SlideTo 5)) ]
[ str "Go to slide 5" ]
滑块的反应组件由 定义react-slick
。
我必须自己编写的寓言包装器,所以它不完整,因为我只定义了我需要的属性。
module Fable.Import.Slick
open Fable.Core
open Fable.Core.JsInterop
open Fable.Helpers
open Fable.Helpers.React.Props
open Fable.Import.React
type SliderProps =
| InitialSlide of int
| AfterChange of (int -> unit)
interface IHTMLProp
let slickStyles = importAll<obj> "slick-carousel/slick/slick.scss"
let slickThemeStyles = importAll<obj> "slick-carousel/slick/slick-theme.scss"
let Slider = importDefault<ComponentClass<obj>> "react-slick/lib/slider"
let slider (b: IHTMLProp list) c = React.from Slider (keyValueList CaseRules.LowerFirst b) c
因此,虽然react-slick
定义了一个属性InitialSlide
来设置最初应该显示的幻灯片,但没有属性可以在之后更新幻灯片。有一种方法slickGoTo
可以做我想做的事。但我不知道如何或在哪里调用该方法,同时仍符合 Elmish。
我可以想象我必须扩展反应组件并监听模型属性,然后slickGoTo
在该属性更改时调用。但我不知道这是否可能。
所以我的问题是:如何slickGoTo
在不破解 Elmish 架构的情况下使用由组件定义的按钮来更改单击时的幻灯片编号?
解决方案
为了能够调用该方法slickGoTo
,您需要获取对滑块对象的引用。为此,请使用Ref
需要 type 函数的道具(Browser.Element -> unit)
。它被调用一次。将该元素保存在某处,可能在您的模型中:
type Model = {
...
slideNumber : int
sliderRef : Browser.Element option
...
}
let gotoSlide sliderRef n =
match sliderRef with None ->
| None -> ()
| Some slider -> slider?slickGoTo n
这样你就可以gotoSlide
从你的更新函数中调用。
type Msg =
| SetSliderRef of Browser.Element
| CurrentSlide of int
| GotoSlide of int
...
let update msg model =
match msg with
| SetSliderRef e -> { model with sliderRef = Some e } , []
| CurrentSlide n -> { model with slideNumber = n } , []
| GotoSlide n -> gotoSlide model.sliderRef n ; model, []
...
像这样创建幻灯片:
slider
[ Ref (SetSliderRef >> dispatch)
AfterChange (CurrentSlide >> dispatch)
InitialSlide 0
]
slides
我还没有测试过任何这些,所以带上一粒盐。
推荐阅读
- java - Spring Data Streamable vs Stream
- python - Flask中的多对多关系插入记录
- javascript - BST 和表设置反应
- html - 网页末尾的页脚(内容之后)
- sql - 处理请求时发生未处理的异常 SqlException
- xpath - 如何使用 xpath/scrapy 根据 id 标签选择两个特定项目之间的所有项目
- java - Spring Batch - Spring Batch Retry 和 backoffPolicy 不起作用
- lua - 我的“模块事件”是很多加载参数
- django - 无法在 django 中访问上传的媒体文件
- mongodb - 基本身份验证应该在邮递员中响应 500(授权),但 401 Unathorized 可以正常工作。使用 ktor intellij mongodb