当前位置: 首页 > 面试题库 >

从外部访问React状态

淳于俊迈
2023-03-14
问题内容

我想使用React.js制作一个应用程序。我希望它可以轻松地从外部进行自定义(例如,通过编写用户脚本)。我尝试使用的想法是在根元素状态(如sidebarItemsplaylistCreatedHooks)中创建一些特殊的属性,以便插件开发人员可以在此处添加一些内容。我的问题是:这是否是一个好方法,是否有Right
Way™实现与我的目标相似的目标,最后,插件开发人员将如何使用这些道具?


问题答案:

一种选择是可观察的。基本上,它是一个对象,您可以听其更改并创建更改。您还可以在data.playlists上发出其他事件(如“
add”事件)来创建您要提供的api。

// data.js
var data = {
  sidebarItems: Observable([]),
  playlists: Observable([])
};

// app.js
var App = React.createComponent({
  mixins: [data.sidebarItems.mixin("sidebar")],
  render: function(){
    return this.state.sidebar.map(renderSidebarItem);
  }
});

/// userscript.js

// causes the view to update
data.sidebarItems.set(somethingElse);

// run when someone does data.playlists.set(...)
data.playlists.on('change', function(playlists){

});

// an event you could choose to emit with data.playlists.emit('add', newPlaylist)
data.playlists.on('add', function(newPlaylist){

});

这是上面使用的Observable的示例(未经测试)实现,带有用于生成react组件mixin的额外功能。

var events = require('events'); // or some other way of getting it
var Observable = function(initialValue){
  var self = new events.EventEmitter();
  var value = initialValue;

  self.get = function(){ return value };
  self.set = function(updated){
    value = updated;
    self.emit('change', updated);
  };
  self.mixin = function(key){
    var cbName = Math.random().toString();
    var mixin = {
      getInitialState: function(){ var o = {}; o[key] = value; return o },
      componentDidMount: function(){
        self.on('change', this[cbName]);
      },
      componentWillUnmount: function(){
        self.removeListener('change', this[cbName]);
      }
    }
    mixin[cbName] = function(){
      var o = {}; o[key] = value; this.setState(o);
    };
    return mixin;
  }

  return self;
}


 类似资料:
  • 我一直在尝试使用githubrowsersample对sunflower应用程序示例进行Restfulise,所以我一直在尝试进行一些复制和粘贴。然而,我完全搞不懂为什么会出现这个错误。此特定代码是完整的复制和粘贴。 我收到的错误是: 错误:DataBoundViewHolder(T)在DataBoundViewHolder中不是公共的;无法从T为类型变量的包外部访问:T扩展了DataBoundV

  • 我无法从外部访问我的服务。首先,这里是我的conf yaml文件: nginx-pod.yaml nginx-service.yaml metallb-config.yaml 然后我创建了集群。命令 打印: 一切正常,而且< code > ku bectl describe service/nginx-service 打印: curl命令在主服务器打印。接下来我试图从另一个网络打开,它不起作用,但

  • 问题内容: 我有两个包。我要从第一个包中导入的类声明为PUBLIC。尽管如此,当我从第二个软件包测试文件时,它向我显示了如下编译错误: PUBLICclass在mypackage中不是公共的;无法从外部包访问 我试图从第一个程序包中向该类添加一个公共构造函数,但没有任何区别。 你有什么想法?我使用Netbeans 7。 第一个包中的类如下所示: 问题答案: 让我猜猜 您最初的课堂声明不是公开的,然

  • https://github.com/confluentinc/cp-docker-images/blob/5.0.0-post/examples/kafka-cluster/docker-compose.yml 我已经编辑了该文件,并将选项添加到docker组合文件中,以便可以在主机之外访问它们。 我已经运行了以下命令: kafka-1、kafka-2、kafka-3的docker日志(均相同)

  • 前面几节讲到如何访问kubneretes集群,本文主要讲解访问kubenretes中的Pod和Serivce的几种方式,包括如下几种: hostNetwork hostPort NodePort LoadBalancer Ingress 说是暴露Pod其实跟暴露Service是一回事,因为Pod就是Service的backend。 hostNetwork: true 这是一种直接定义Pod网络的方

  • 问题内容: 如何从内部类访问外部类? 我正在重写一种使它在不同线程上运行的方法。从内联线程中,我需要调用原始方法,但是当然只要调用就会变成无限递归。 具体来说,我在扩展BufferedReader: 这个地方给了我我找不到的NullPointerException。 谢谢。 问题答案: 像这样: 上面的测试在执行时显示: