Props, reconciler fixes, demo fixes
This commit is contained in:
parent
47163c64f9
commit
290b57d336
17 changed files with 284 additions and 190 deletions
|
|
@ -1,30 +1,36 @@
|
|||
//! Implements the `RSX::VirtualNode` struct, which is a bit of a recursive
|
||||
//! structure.
|
||||
|
||||
use std::any::Any;
|
||||
use std::fmt::{Display, Debug};
|
||||
|
||||
use alchemy_styles::StylesList;
|
||||
|
||||
use crate::reconciler::key::ComponentKey;
|
||||
use crate::rsx::{RSX, Props};
|
||||
use crate::rsx::RSX;
|
||||
use crate::traits::Component;
|
||||
|
||||
/// A VirtualNode is akin to an `Element` in React terms. Here, we provide a way
|
||||
/// for lazy `Component` instantiation, properties, children and so on.
|
||||
#[derive(Clone)]
|
||||
pub struct VirtualNode {
|
||||
/// Used in debugging/printing/etc.
|
||||
pub tag: &'static str,
|
||||
|
||||
/// Used for determining which CSS styles should be applied to this node.
|
||||
/// This property is accessed often enough that it's separated out here.
|
||||
pub styles: StylesList,
|
||||
|
||||
/// `Component` instances are created on-demand, if the reconciler deems it be so. This
|
||||
/// is a closure that should return an instance of the correct type.
|
||||
pub create_component_fn: fn(key: ComponentKey) -> Box<Component>,
|
||||
|
||||
/// `Props`, which are to be passed to this `Component` at various lifecycle methods. Once
|
||||
/// the reconciler takes ownership of this VirtualNode, these props are moved to a different
|
||||
/// location - thus, you shouldn't rely on them for anything unless you specifically keep
|
||||
/// ownership of a VirtualNode.
|
||||
///
|
||||
/// This aspect of functionality may be pulled in a later release if it causes too many issues.
|
||||
pub props: Props
|
||||
/// When some RSX is returned, we scoop up the props inside a special block, and then shove
|
||||
/// them in here as an `Any` object. When you `derive(Props)` on a `Component` struct, it
|
||||
/// creates a setter that specifically handles downcasting and persisting props for you.
|
||||
pub props: Box<Any>,
|
||||
|
||||
/// Child components for this node.
|
||||
pub children: Vec<RSX>
|
||||
}
|
||||
|
||||
impl Display for VirtualNode {
|
||||
|
|
@ -32,7 +38,7 @@ impl Display for VirtualNode {
|
|||
fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
|
||||
write!(f, "<{}>", self.tag)?;
|
||||
|
||||
for child in &self.props.children {
|
||||
for child in &self.children {
|
||||
write!(f, "{:?}", child)?;
|
||||
}
|
||||
|
||||
|
|
|
|||
Reference in a new issue