Flux/React Complex 可重复使用组件

2024-02-24

我想做这样的事情

var App = React.createClass({
    render: function() {
        return (
            <CountryAutoComplete />
        )
    }
});

不同的应用程序

var App2 = React.createClass({
    render: function() {
        return (
            <CountryAutoComplete />
        )
    }
});

这是一个简单的自动完成(不是整个文件)

var AutoComplete = React.createClass({
    componentDidMount: function() {
        $(this.getDOMNode()).typeahead(this.props);
    },
    render: function() {
        return (
            <input type="text" class="typeahead" onChange={this.props.onChange} />
        );
    }
});

国家/地区自动完成功能就像这样是独立的。

var CountryAutoComplete = React.createClass({
    search: function(country, process) {
        // Make an ajax call and return the data. No other components needed
        $.ajax({
            url: '/country' + '?search=' + country
        }).then(process);
    },
    render: function() {
        return (
            <AutoComplete onChange={this.props.onChange} source={this.search} />
        );
    }
});

根据 Flux 文档,看起来任何具有 API 调用的内容都需要经过

操作 -> API -> 调度程序 -> 存储 -> 组件

这使得 CountryAutoComplete 绑定到特定的应用程序,因为操作、调度程序和存储是特定于该应用程序的。使该组件可跨应用程序重用的最佳方法是什么?


您不应该在自动完成组件中进行任何 ajax 调用(因为您说过要使其可重用)。我通常将所有数据请求调用/API 使用放入一个单独的模块中,该模块使用 Promise 来防止多个请求

因此,我们的想法是让自动完成组件从父组件获取选项/数据。该父组件最初可以从存储中获取数据,并侦听该存储中的任何更改事件,并在需要时更新其状态。通过那个this.state.options(或您用于选项的任何状态)作为自动完成的支持。当用户键入内容时,通过查询发出一个操作。该操作依次调用 API 和 Dispatcher、更新存储并为存储发出更改事件。您的父组件将分别更新其状态,并将作为 prop 流向 AutoComplete 组件。

所以像这样:

var App = React.createClass({
    getInitialState: function() {
        return {
            // default results/data?
            data : Store.getResults('')
        };
    },
    storeChangeListener: function(newData) {
        this.setState({
            data: newData
        });
    },
    componentDidMount: function() {
        this.listenTo(Store, this.storeChangeListener);
    },
    onChange: function(query) {
        // on search change
        Actions.getResults(query);
    },
    render: function() {
        return (
            <AutoComplete data={this.state.data} onChange={this.onChange} />
        );
    }
});

在商店里,有这样的东西:

var countryAPI = require('./countryAPI')
var Store = {
    getResults: function(query) {
        // check cache if any? otherwise make call
        if(this.cache[query]) {
            return this.cache[query];
        } else {
            countryAPI.search(query).then(this.update);
        }
    },
    update: function(data) {
        AppDispatcher.dispatch({
            type: "DATA_FROM_SERVER",
            payload: {id: query, data: result}
        })
    },
    handleDataFromServer: function(action) {
        //store into cache/store
        this.cache[action.payload.id] = action.payload.result;
        this.emit("change"); // re-render app on whoever is listening to this store
    }
}

和你的 api 例如

var countryAPI = {
    search: function(query) {
        // check to make sure this promise isnt called before
        if(!this.allPromises[query]) {
            this.allPromises[query] = $.ajax({
                url: '/country' + '?search=' + country
            })
        }
        return this.allPromises[query];
    }
}

总而言之,实际的 API 实现应该与 Flux 操作分开,它们只应该关心 Web-API 特定的内容,并让 Flux 操作/存储作为数据流单独处理响应:

Component --> Listens to Store
          --> Calls Load Action --> Show Pending State/Optimistic Updates --> Dispatcher --> Store --> changeEvent (Component will be listening and be updated)
          --> countryAPI.load() 
onLoadSuccess --> Dispatcher --> Store --> changeEvent --> Component
onLoadError   --> Dispatcher --> Store --> changeEvent --> Component
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flux/React Complex 可重复使用组件 的相关文章

随机推荐

  • 通过反应路由器时隐藏 id 或查询字符串

    我有传递 id 的路线 但我不想在 url 中显示 id
  • Json.Net反序列化内存不足问题

    我得到一个 Json 其中包含一个存储 Base64 编码字符串的数据字段 该 Json 被序列化并发送给客户端 在客户端 newtonsoft json net 反序列化器用于取回 Json 但是 如果数据字段变大 400 MB 反序列化
  • 如何获取频道中所有消息的列表,然后从该列表中随机选择一条消息作为消息发送?

    我之前尝试在 StackOverflow 上寻找这个问题的答案 结果发现this https stackoverflow com questions 56349020 how can i get an array of all the me
  • 使用VCL样式时显示窗口阴影

    使用 VCL 样式时 有没有办法按照正常的 Windows 7 窗体显示窗口阴影 我知道样式中的位图和设置取代了表单边框 但是阴影不是某种位于受样式影响的区域之外的 alpha 混合 航空物体吗 将 CS DROPSHADOW 添加到 Wi
  • angularJS:相当于 $location.search 的 ui-router

    我使用以下内容在数据网格中进行分页 location search page page 其中 page 是当前页码 然后我听以下事件 scope on routeUpdate function next current scope curr
  • plot_decision_regions 出现错误“当 X 具有超过 2 个训练特征时,必须提供填充值。”

    我正在绘制 SVC 伯努利输出的 2D 图 从 Avg word2vec 和标准化数据转换为向量 分割数据进行训练和测试 通过网格搜索找到最好的C和gamma rbf clf SVC C 100 gamma 0 0001 clf fit X
  • SDKMAN!不适用于 Eclipse.app 或 SpringToolSuite4.app(在 Mac 上)

    这是一个类似的问题 Eclipse找不到用sdkman安装的jdk https stackoverflow com questions 48248222 eclipse cant find jdk installed with sdkman
  • Prolog,在列表中找到最小值

    简而言之 如何找到列表中的最小值 感谢卡雷尔的建议 很长的故事 我在 amzi prolog 中创建了一个加权图 并给定 2 个节点 我能够检索路径列表 但是 我需要找到该路径中的最小值 但无法遍历列表来执行此操作 我可以就如何确定列表中的
  • 使用 Flask 作为文件上传的传递代理?

    它用于应用程序引擎的 blobstore 因为它的上传接口每次都会生成一个临时端点 我想消除前端的复杂性 Flask 会接受 post 请求并将其转发到 blobstore 指定的端点 性能和流量成本根本不是问题 有人可以推荐一种最直接的实
  • Array(x) 是一种什么样的 ruby​​ 方法调用

    以下内容的含义是什么 其语法的 Ruby 文档在哪里 Array phrases 我在此处浏览 Rails 源代码时发现 File actionpack lib action view helpers text helper rb line
  • 将代码从 MySQL 更改为 PDO

    我制作了一个使用 MySQL 语法编写的 CMS 脚本 我想用 PDO 语法替换 MySQL 语法 有人可以吗帮我做 and 向我解释一下该怎么做 这是脚本中的代码
  • 如何在 Xcode 7 中使用 xcodebuild 和手表扩展

    我们的命令以前是这样的 xcodebuild configuration Release target xxx sdk iphoneos9 0 scheme xxx archive 现在在 Xcode 7 中 我们收到此错误 Build s
  • 通过 Linux FrameBuffer 将像素绘制到屏幕

    最近 我被一个奇怪的想法所震惊 从 dev urandom 获取输入 将相关字符转换为随机整数 然后使用这些整数作为像素的 rgb x y 值来绘制到屏幕上 我做了一些研究 在 StackOverflow 和其他地方 许多人建议您可以直接写
  • 使用 iText 更改 PDF Producer 属性

    是否可以使用 iText 更改 PDF 文档的现有属性 我试过这个 Map
  • Google 登录错误 12500

    我正在尝试将 Google Sign In 集成到我的应用程序中 我没有后端服务器 我只是将登录的 Google 帐户的详细信息获取到我的应用程序 我首先尝试使用Google 登录示例 https github com googlesamp
  • 转义特殊字符 (ø, æ) 以在 url 内使用

    我尝试在 iOS 应用程序中显示带有 URL 源的图像 但它没有显示 图像的 url 是实时示例路径 使用以下 Objective C 代码转义该字符串时 NSString url NSString CFURLCreateStringByA
  • 检查指定名称的屏幕是否存在

    我制作了一个 bash 文件 它在独立的屏幕中启动另一个具有唯一名称的 bash 文件 我需要确保该内部 bash 文件的一个实例在任何一个时间点都在运行 为此 我希望在尝试创建父 bash 文件之前检查该名称的屏幕是否存在 有没有办法做到
  • 正则表达式 $1、$2 等

    我一直在尝试在 PHP 中进行一些正则表达式操作 但我在这方面不是很熟练 似乎当我在字符串上使用像 preg replace 这样的正则表达式函数时 我可以通过某种名为 1 2 等的变量访问正则表达式替换的字符串 这叫什么 我该如何使用它
  • 使 CSS 工具提示跟随光标

    我正在创建一个基于 CSS 的工具提示 该工具提示中将包含大量内容 而不是处于静态位置 我想知道是否有一种简单的方法可以使其在将鼠标悬停在链接上时跟随光标 这是基于 CSS 的工具提示示例 div class couponcode Firs
  • Flux/React Complex 可重复使用组件

    我想做这样的事情 var App React createClass render function return