问题
I feel like I'm missing something obvious, but how do I remove nodes from the render tree and destroy them correctly?
It looks like I can just do something like mainCtx._node._child.splice(2,1)
, but this doesn't work in all cases (Scrollviews seem to stick around), and assume there's something relevant in the API but I can't seem to find it.
回答1:
You never remove renderNodes - you use smart RenderNodes to manipulate what is rendered.
The solution depends on what you want to accomplish:
1) I want to manipulate the layout
The easiest way to show / hide / swap parts of the RenderTree is to use a RenderController
. You can even specify in/out transitions
var renderController = new RenderController();
renderController.show( .... );
renderController.hide( .... );
See the official example
2) I want to manage performance (and remove stuff I don't need)
Don't worry about removing nodes. Famo.us will manage this for you.
If you want to take control of rendered nodes, write a custom View
with a render
function. The Flipper class is a simple example (and the RenderController is a complex example of this pattern)
In depth explanation:
- Every
RenderNode
has arender
function which creates a renderSpec. - The renderSpec contains information about a
Modifier
orSurface
.- The
Modifier
specs are used to calculate the final CSS properties. - The
Surface
specs are coupled to DOM elements.
- The
- Every tick of the
Engine
, the renderSpec is rendered using theRenderNode.commit
function. - The
commit
function uses theElementAllocator
(from theContext
) to allocate/deallocate DOM elements. (Which actually recycles DOM nodes to conserve memory)
Therefore: Just return the correct renderSpec in your custom View
, and famo.us will manage memory and performance for you.
BTW, you don't need to use the View
class - an object with a render
function will suffice. The View
class simply adds events and options which is a nice way to create encapsulated, reusable components.
Update: Ready-made Solutions
ShowModifier (gist) a simple modifier to show/hide parts of the rendering tree
var mod = new ShowModifier({visible:true});
mod.visible = true;
mod.show();
mod.hide();
or, as alternative, use this gist to add visibility functions to Modifier
and StateModifier
modifier.visibleFrom(function(){ return true; }) // function, getter object or value
stateModifier.setVisible(true); // or false
WARNING: Adding/removing DOM-nodes by manipulating the renderspec might cause a performance penalty!
来源:https://stackoverflow.com/questions/23087980/how-to-remove-nodes-from-the-render-tree