Мы используем его с пользовательскими пулами памяти. Просто эскиз:
class Pool {
public:
Pool() { /* implementation details irrelevant */ };
virtual ~Pool() { /* ditto */ };
virtual void *allocate(size_t);
virtual void deallocate(void *);
static Pool::misc_pool() { return misc_pool_p; /* global MiscPool for general use */ }
};
class ClusterPool : public Pool { /* ... */ };
class FastPool : public Pool { /* ... */ };
class MapPool : public Pool { /* ... */ };
class MiscPool : public Pool { /* ... */ };
// elsewhere...
void *pnew_new(size_t size)
{
return Pool::misc_pool()->allocate(size);
}
void *pnew_new(size_t size, Pool *pool_p)
{
if (!pool_p) {
return Pool::misc_pool()->allocate(size);
}
else {
return pool_p->allocate(size);
}
}
void pnew_delete(void *p)
{
Pool *hp = Pool::find_pool(p);
// note: if p == 0, then Pool::find_pool(p) will return 0.
if (hp) {
hp->deallocate(p);
}
}
// elsewhere...
class Obj {
public:
// misc ctors, dtors, etc.
// just a sampling of new/del operators
void *operator new(size_t s) { return pnew_new(s); }
void *operator new(size_t s, Pool *hp) { return pnew_new(s, hp); }
void operator delete(void *dp) { pnew_delete(dp); }
void operator delete(void *dp, Pool*) { pnew_delete(dp); }
void *operator new[](size_t s) { return pnew_new(s); }
void *operator new[](size_t s, Pool* hp) { return pnew_new(s, hp); }
void operator delete[](void *dp) { pnew_delete(dp); }
void operator delete[](void *dp, Pool*) { pnew_delete(dp); }
};
// elsewhere...
ClusterPool *cp = new ClusterPool(arg1, arg2, ...);
Obj *new_obj = new (cp) Obj(arg_a, arg_b, ...);
Теперь вы можете сгруппировать объекты вместе на одной арене памяти, выбрать распределитель, который очень быстр, но не освобождает память, не использует сопоставление памяти и любую другую семантику, которую вы хотите наложить выбрав пул и передав его в качестве аргумента для нового оператора размещения объекта.
Вы закрываете подпорки фигурной скобой раньше. Кроме того, передайте onClick функцию вместо вызова там предупреждения, которое будет выполняться сразу после монтирования компонента.
const clone = React.cloneElement(<BallComponent>, {
key: new Date().getTime()
onClick: () => { alert('test') }
});
Это минимальный пример для использования React.cloneElement
.
import React from "react";
import ReactDOM from "react-dom";
class Demo extends React.Component {
render() {
return <p onClick={this.props.click}>This is Demo. Click me.</p>;
}
}
function App() {
const clone = React.cloneElement(<Demo />, {
click: () => {
alert("You clicked Demo :)");
}
});
return (
<div className="App">
{clone}
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
В этом примере вы выполняете alert('test')
и присваиваете его возвращаемое значение onChange
, в данном случае undefined
.
Вам нужно передать функцию:
const clone = React.cloneElement(<BallComponent>, {
key: new Date().getTime()}
onClick: () => { alert('test') };
});
Используйте фрагмент кода ниже, и он будет работать.
var Clone = React.cloneElement(<BallComponent/>, {
key: new Date().getTime(),
onClick: () => { alert('test') }
});
P.S.-Убедитесь, что у BallComponent есть onClick, если предупреждение не сработает.
BLOCKQUOTE>