如果我要通过 components 属性将对象传递给子组件,这个对象是被克隆还是只是传递对原始对象的引用?
例如,在我的 App.js 中,我正在导入一个 JSON 对象 ENTRY_DATA。然后我通过 Prop 将该对象传递给我的子组件(或在本例中为路由)。我这样做是在节省内存还是与在每个组件上导入 ENTRY_DATA 一样?
import React, { Component } from 'react';
import { withRouter, Route } from 'react-router-dom'
import ENTRY_DATA from './../../entry_data.json';
import Register from '../Register/Register';
import Categories from '../Categories/Categories';
import Category from '../Category/Category';
import Entry from '../Entry/Entry';
class App extends Component {
render() {
return (
<div className="app" >
<main>
<Route exact path="/" component={Register} />
<Route exact path='/categories' render={(props) => (
<Categories {...props} categories={ENTRY_DATA} />
)}/>
<Route exact path='/categories/:category' render={(props) => (
<Category {...props} categories={ENTRY_DATA} />
)}/>
<Route exact path='/categories/:category/:entry' render={(props) => (
<Entry {...props} categories={ENTRY_DATA} />
)}/>
</main>
</div>
);
}
}
export default withRouter(App);
如果 ENTRY_DATA 是 5kb,并且我将它传递给 3 个不同的组件,这是否意味着我最终得到了 20kb 的 ENTRY_DATA 或者它们是否都引用了一个5kb ENTRY_DATA?
最佳答案
一般来说,这取决于所述 prop 的数据类型。 整数 或 字符串 等基本类型通过其值传递,而对象数据类型(如数组)通过引用传递。
所以是的,对象特别通过引用传递。
演示:
在这个演示中,我们有两个组件,一个父组件和一个子组件。 child 接受两个 Prop ,一个是整数 1,另一个是带有 a: "foo" 的对象。
片刻之后,我们从父级将整数值从 1 更改为 2 并将对象从 a: "foo"到 a: "bar"。之后,我们从子组件中记录这些 props 的值。
注意:这是一个无状态组件,因此我们没有使用任何类型的状态。我们直接改变值,所以 React 永远不会“知道”这个改变! (ssh,不要告诉 React!)
整数的输出仍然是 1(没有改变 - 按值传递),但是对象的输出是 a: "bar"(改变了! - 通过了通过引用)。
const Parent = () => {
let myInt = 1;
let myObj = {a: "foo"};
setTimeout(function(){
myInt = 2;
myObj.a = "bar";
}, 500);
return <Child myInt={myInt} myObj={myObj} />;
}
const Child = ({myInt, myObj}) => {
setTimeout(function(){
console.log(myInt);
console.log(myObj);
}, 1000);
return (
<div>
<p>{myInt}</p>
<p>{JSON.stringify(myObj)}</p>
</div>
);
}
ReactDOM.render(<Parent />, document.getElementById("app"));<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
关于javascript - 是通过 Prop 将对象传递给子 react 组件,克隆原始对象还是通过引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48210000/
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只
这是我的网络应用:classFront我是这样开始的(请不要建议使用Rack):Front.start!这是我的Puma配置对象,我不知道如何传递给它:require'puma/configuration'Puma::Configuration.new({log_requests:true,debug:true})说真的,怎么样? 最佳答案 配置与您运行的方式紧密相关puma服务器。运行的标准方式puma-pumaCLI命令。为了配置puma配置文件config/puma.rb或config/puma/.rb应该提供(参见examp
我有一个电子邮件表格。但是我正在制作一个测试电子邮件表单,用户可以在其中添加一个唯一的电子邮件,并让电子邮件测试将其发送到该特定电子邮件。为了简单起见,我决定让测试电子邮件通过ajax执行,并将整个内容粘贴到另一个电子邮件表单中。我不知道如何将变量从我的HAML发送到我的Controllernew.html.haml-form_tagadmin_email_blast_pathdoSubject%br=text_field_tag'subject',:class=>"mass_email_subject"%brBody%br=text_area_tag'message','',:nam
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我正在构建一个应用程序,想知道是否将未使用的对象设置为nil是生产级编码中的常见做法。我知道这只是垃圾收集器的提示,并不总是处理对象。 最佳答案 根据这个thread如果您使用完一个成员对象,将其设置为nil将引发被引用对象被垃圾回收。如果它是局部变量,方法exit将做同样的事情。也就是说,如果您要求将成员显式设置为nil,我会质疑您的设计。 关于ruby-将对象设置为nil是否很常见?,我们在StackOverflow上找到一个类似的问题: https://
我最近开始从事一个项目,该项目使用git进行存储并使用ruby作为前端。我的脚本的第一个版本使用了ruby-git,虽然非常简单,但还不错。当我需要对我的提交和日志做更具体的工作时,建议我转向砂砾。然而,我在早期遇到了障碍——grit似乎无法克隆远程存储库。我发现使用Repository类的所有示例都创建了一个本地存储库并搜索了我发现Grit的clone方法未定义的源代码。给了什么?这是我的第一个StackOverflow问题,在此先感谢您的帮助。 最佳答案 由于Git结构良好,Grit使用缺少的方法(Grit::Git#m
如何将lambda传递给hash.each,以便我可以重复使用一些代码?>h={a:'b'}>h.eachdo|key,value|end=>{:a=>"b"}>test=lambdado|key,value|puts"#{key}=#{value}"end>test.call('a','b')a=b>h.each&testArgumentError:wrongnumberofarguments(1for2)from(irb):1:in`blockinirb_binding'from(irb):5:in`each'from(irb):5from/Users/jstillwell/.rv
我正在尝试将cucumber项目的用户名和密码置于版本控制之外。有没有办法在命令行上手动将用户名和密码等变量传递给Cucumber脚本?我的备份计划是将它们放在一个YML文件中,然后将该文件添加到gitignore,这样它们就不会被置于版本控制中。 最佳答案 所以,我看到了您对铁皮人的评论,答案是肯定的。cucumberPASSWORD=my_passwordPASSWORD被设置为环境变量,您可以通过将其引用为ENV['PASSWORD']来使用它的值。例如,browser.text_field(:id=>'pwd').setEN