GVKun编程网logo

如何避免render方法中的绑定或内联箭头功能(render怎么使用)

10

在本文中,我们将带你了解如何避免render方法中的绑定或内联箭头功能在这篇文章中,我们将为您详细介绍如何避免render方法中的绑定或内联箭头功能的方方面面,并解答render怎么使用常见的疑惑,同

在本文中,我们将带你了解如何避免render方法中的绑定或内联箭头功能在这篇文章中,我们将为您详细介绍如何避免render方法中的绑定或内联箭头功能的方方面面,并解答render怎么使用常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的@RequestMapping在render方法中有2个参数、c# – 如何避免Radwindow Open上的回发?、c# – 如何避免RCW清理比赛、ES集群启动时如何避免rebalance

本文目录一览:

如何避免render方法中的绑定或内联箭头功能(render怎么使用)

如何避免render方法中的绑定或内联箭头功能(render怎么使用)

我们应该避免在render内部绑定方法,因为在重新渲染期间它将创建新方法而不是使用旧方法,这会影响性能。

所以对于这样的场景:

<input onChange = { this._handleChange.bind(this) } ...../>

我们可以_handleChange在构造函数中绑定方法:

this._handleChange = this._handleChange.bind(this);

或者我们可以使用属性初始化器语法:

_handleChange = () => {....}

现在让我们考虑一下要传递一些额外参数的情况,在一个简单的todo应用中说,项目的onclick我需要从数组中删除该项目,为此我需要在每个项目中传递项目索引或todo名称onClick方法:

todos.map(el => <div key={el} onClick={this._deleteTodo.bind(this, el)}> {el} </div>)

现在,仅假定待办事项名称是唯一的。

根据 DOC

这种语法的问题在于,每次渲染组件时都会创建一个不同的回调。

题:

如何避免在render方法中使用这种绑定方式,或者有什么替代方法?

请提供任何参考或示例,谢谢。

答案1

小编典典

首先: 一个简单的解决方案是为map函数内部的内容创建一个组件并将值作为prop传递,当您从子组件调用该函数时,可以将值传递给props传递的函数。

父母

deleteTodo = (val) => {    console.log(val)}todos.map(el =>     <MyComponent val={el} onClick={this.deleteTodo}/>)

我的组件

class MyComponent extends React.Component {    deleteTodo = () => {        this.props.onClick(this.props.val);    }    render() {       return <div  onClick={this.deleteTodo}> {this.props.val} </div>    }}

样本片段

class Parent extends React.Component {     _deleteTodo = (val) => {        console.log(val)    }    render() {        var todos = [''a'', ''b'', ''c''];        return (           <div>{todos.map(el =>             <MyComponent key={el} val={el} onClick={this._deleteTodo}/>           )}</div>        )    }}class MyComponent extends React.Component {        _deleteTodo = () => {                     console.log(''here'');   this.props.onClick(this.props.val);        }        render() {           return <div onClick={this._deleteTodo}> {this.props.val} </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>

编辑:

第二: 另一种方法是使用备忘录并返回一个函数

constructor() {    super();    this._deleteTodoListener = _.memoize(                   this._deleteTodo, (element) => {                        return element.hashCode();                    }              )}_deleteTodo = (element) => {   //delete handling here}

并像这样使用

todos.map(el => <div key={el} onClick={this._deleteTodoListener(el)}> {el} </div>)

PS但是,这不是最佳解决方案,仍然会导致创建多个功能,但与初始情况相比仍是一个改进。

第三: 不过,更合适的解决方案是attribute在最上面的div中添加an 并从eventlike 获得值

_deleteTodo = (e) => {     console.log(e.currentTarget.getAttribute(''data-value'')); } todos.map(el => <div key={el} data-value={el} onClick={this._deleteTodo}> {el} </div>)

然而,在这种情况下,属性利用toString方法,并因此被转换成字符串,对象将被转换为[Object Object]和与阵列等["1" , "2","3"]作为"1, 2, 3"

@RequestMapping在render方法中有2个参数

@RequestMapping在render方法中有2个参数

我正在尝试在同一控制器中管理2个动作,一切正常!唯一的是doRender方法。我正在尝试对两个操作使用相同的渲染方法,如下所示:

private static final String ACTION_ALTA_TIPO_FACTURA = "action=" + ServletContextKeys.SC_ALTA_TIPO_FACTURA;private static final String ACTION_BAJA_TIPO_FACTURA = "action=" + ServletContextKeys.SC_BAJA_TIPO_FACTURA;@RequestMapping(params = {ACTION_BAJA_TIPO_FACTURA,ACTION_ALTA_TIPO_FACTURA})public final String doRender(@ModelAttribute(value = "Factura") Factura justfactura, Errors errors, RenderRequest renderrequest) {        ...}

但是显然这是行不通的。服务器日志显示的内容如下:

[#|2012-09-28T11:54:05.723+0000|SEVERE|sun-appserver2.1|debug.com.sun.portal.portletcontainer.impl|_ThreadID=21;_ThreadName=httpSSLWorkerThread-8080-0;sifo3economicoweb|SifoIIIweb|SifoIIIweb_WAR_sifo3economicoweb_INSTANCE_fu7M;org.springframework.web.portlet.NoHandlerFoundException: No matching handler method found for portlet request: mode ''view'', phase ''RENDER_PHASE'', parameters map[''action'' -> array<String>[''altaFactura''], ''altaFactura_tabs'' -> array<String>[''factura'']];_RequestID=7ffe667a-23c0-4599-b1f6-0a53d11a5cb7;|PSPL_PCCSPCPCI0001 : Exception thrown from EntityID: sifo3economicoweb|SifoIIIweb|SifoIIIweb_WAR_sifo3economicoweb_INSTANCE_fu7M, cause: org.springframework.web.portlet.NoHandlerFoundException: No matching handler method found for portlet request: mode ''view'', phase ''RENDER_PHASE'', parameters map[''action'' -> array<String>[''altaFactura''], ''altaFactura_tabs'' -> array<String>[''factura'']]|#]

有什么帮助吗?

答案1

小编典典

唯一的方法是定义多个方法。

c# – 如何避免Radwindow Open上的回发?

c# – 如何避免Radwindow Open上的回发?

我正在使用radgrid来填充表格.打开单击后将打开radwindow.

<telerik:RadButton ID="create" Text="Open radwindow" runat="server" OnClientClicking="Open" AutopostBack="false" CausesValidation="false" Skin="WebBlue" Font-Bold="true" Height="22px" Width="97px" ToolTip="Click here to Create a new meeting">
            </telerik:RadButton>
        <telerik:radwindowManager ID="radwindowManager1" runat="server" EnableShadow="true" EnableViewState="false"></telerik:radwindowManager>
<telerik:radwindow id="radCreatePopup" NavigateUrl="page2.aspx"  Top="30" OnClientShow="OnClientshow" Left="100" VisibleStatusbar="false"
     Modal="true" CenterIfModal="true" OnClientClose="Close" runat="server" Width="770px" Height="390px" Skin="WebBlue" Behaviors="Resize,Close,Move,Reload" ReloadOnShow="True" />

用于打开和关闭的Javascript代码

(function (global,undefined) {
            var button = null;
            function OnClientshow(sender,eventArgs) {
            }
            function open() {
                var oWnd = $find("<%= radCreatePopup.ClientID %>").show();
            }
            global.OnClientshow = OnClientshow;
            global.Open = Open;
        })(window);

        function Close() {
            var oWnd = $find("<%= radCreatePopup.ClientID %>").Close();
            rebind();
            return false;
        }

一切正常,但如果我打开radwindow,父页面将一次又一次地回发.

解决方法

由于您使用的是ReloadOnShow =“True”,因此每次都会重新加载.所以删除代码并运行它.

c# – 如何避免RCW清理比赛

c# – 如何避免RCW清理比赛

我有一个gui应用程序,定期显示cpu负载.负载由StateReader类读取:

public class StateReader
{
    ManagementObjectSearcher searcher;

    public StateReader()
    {
        ManagementScope scope = new ManagementScope("\\\\localhost\\root\\cimv2");
        ObjectQuery query = new ObjectQuery("select Name,PercentProcessorTime from Win32_PerfFormattedData_PerfOS_Processor where not Name='_Total'");
        searcher = new ManagementObjectSearcher(scope,query);
    }

    // give the maximum load over all cores
    public UInt64 cpuLoad()
    {
        List<UInt64> list = new List<UInt64>();
        ManagementObjectCollection results = searcher.Get();
        foreach (ManagementObject result in results)
        {
            list.Add((UInt64)result.Properties["PercentProcessorTime"].Value); 
        }
        return list.Max();
    }
}

使用反应式扩展更新gui:

var gui = new GUI();
var reader = new StateReader();

var sub = Observable.Interval(TimeSpan.FromSeconds(0.5))
                    .Select(_ => reader.cpuLoad())
                    .ObserveOn(gui)
                    .Subscribe(gui.ShowcpuState);

Application.Run(gui);
sub.dispose();

现在当我退出我的应用程序时,我收到一个错误说

RaceOnRCWCleanup was detected. 
An attempt has been mad to free an RCW that is in use. The RCW is use on the 
active thread or another thread. Attempting to free an in-use RCW can cause 
corruption or data loss.

如果我没有读取cpu负载,但只提供一些随机值,则不会出现此错误,因此错误以某种方式连接到读取负载.此外,如果我在Application.Run(gui)之后放置一个断点并在那里稍等一下,那么错误似乎并不常见.

从这个和我的谷歌搜索我认为使用管理命名空间中的类创建一个后台线程,引用包含在运行时可调用包装器中的COM对象,当我退出我的应用程序时,该线程没有时间正确关闭RCW,导致我的错误.这是正确的,我该如何解决这个问题?

我编辑了我的代码以反映我的反应,但我仍然得到同样的错误.代码更新了三点:

> StateReader是disposable,将其ManagementObjectSearcher置于dispose方法中
我在main方法中的Application.Run之后调用StateReader对象上的dispose
>在cpuLoad中,我处理了ManagementCollection和每个ManagementObject
>在我的main方法中,我在FormClosing上的事件处理程序中处理订阅对象
在gui上.这应该确保gui关闭后不会生成任何事件.

现在,在StateReader中代码的相关部分:

// give the maximum load over all cores
public UInt64 cpuLoad()
{
    List<UInt64> list = new List<UInt64>();
    using (ManagementObjectCollection results = searcher.Get())
    {
        foreach (ManagementObject result in results)
        {
            list.Add((UInt64)result.Properties["PercentProcessorTime"].Value); 
            result.dispose();
        }
    }
    return list.Max();
}

public void dispose()
{
    searcher.dispose();
}

在我的主要:

gui.FormClosing += (a1,a2) => sub.dispose();

Application.Run(gui);
reader.dispose();

还有什么我可以做的,以避免我得到的错误?

解决方法

我认为你需要使StateReader一次性使用并在退出应用程序之前将其处理掉. StateReader应该处理搜索者.但是,我认为真正的问题是您没有在cpuLoad中部署ManagementObject.如果GC在cpuLoad之后运行,RCW将被释放.但是,如果您在GC之前退出,则可能会触发您看到的异常.

I think that using the classes in the management namespace creates a background thread that references a COM object wrapped in a Runtime Callable Wrapper

Observable.Interval创建一个后台线程,cpuLoad在该线程上执行.

ES集群启动时如何避免rebalance

ES集群启动时如何避免rebalance

为了防止重新平衡,您可以运行以下命令,这通常是在执行 rolling upgrade 之前运行的命令,以防止分片被重新平衡到其他节点。

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "none"
  }
}

我们今天的关于如何避免render方法中的绑定或内联箭头功能render怎么使用的分享就到这里,谢谢您的阅读,如果想了解更多关于@RequestMapping在render方法中有2个参数、c# – 如何避免Radwindow Open上的回发?、c# – 如何避免RCW清理比赛、ES集群启动时如何避免rebalance的相关信息,可以在本站进行搜索。

本文标签: