React Component vs React Element
React Component vs React Element有这样的一个问题: // 方法定义 function add(x,y) { return x + y } // 方法调用 add(1,2) // 组件定义 class Icon extends Component {} // 组件调用?????? <Icon /> 最后的一句 有答“组件声明”的,有答“组件调用的”,有“组件初始化”的,还有“使用一个组件”的。没有一个统一的称呼。造成这样局面的原因是很多时候我们都没有去详细的了解过JSX和React实际操作之间的抽象层。现在我们就深入研究一下这部分知识。 我们来看看最基础的问题,什么是React?React就是一个用来写界面的库。不管React和React的生态有多复杂,最核心的功能就是用来写界面的。那么我们来看看 为了创建一个DOM节点的代表对象(也就是React element),我们可以使用React的 const element = React.createElement( 'div',{id: 'login-btn'},'Login' )
{ type: 'div’, props: { children: 'Login',id: 'login-btn' } } 当这个对象绘制为DOM(使用 <div id='login-btn'>Login</div> 有一个很有意思的地方,我们在学React的时候首先注意到的就是component(组件)。“Components(组件)是React的构建块”。注意,我们是以element开始本文的。而且你一旦理解了element,理解component也就是水到渠成的事了。一个component就是一个方法或者一个类,可以接受一定的输入,之后返回一个React element。 function Button({onLogin}) { return React.createElement( 'div',{id: 'login-btn',onClick: onLogin},'Login' ) } 在上面的定义中,我们有一个 更深入一点目前,我们只接触到了使用HTML元素来创建React element,比如“div”、“span”等。其实,你也可以把其他的React component(组件)作为第一个参数传入 const element = React.createElement( User,{name: 'Uncle Charlie'},null ) 然而,不同于一般的HTML标签名称,React如果发现第一个参数是class或者function类型的话,它就会检查传入的参数要绘制的是一个什么element,传入必要的props。之后React会一直检查,直到没有方法或者类作为第一个参数传入 function Button({addFriend}) { return React.createElement( 'button',{onClick: addFriend},'Add Friend' ) } function User({name,addFriend}) { return React.createElement( 'div',null,React.createElement( 'p',name ),React.createElement(Button,{addFriend}) ) } 上面的例子里有两个component(组件)。一个Button,一个User。User“代表”了一个div,div里面有两个子节点:一个包含用户名的“p”和一个Button组件。现在我们看看上面的例子的具体的调用过程。 function Button({addFriend}) { return { type: 'button',props: { onClick: addFriend,children: 'Add Friend' } } } function User({name,addFreind}) { return { type: 'div',props: { children: [ { type: 'p',props: { children: name } },{ type: Button,props: { addFriend } } ] } } } 在上面的代码里你会看到四种不同的属性:“button”,“div”,“p”和 { type: 'div',props: { children: [ { type: 'p',props: { children: 'Tyler McGinnis' } },{ type: 'button',props: { onClick: addFriend,children: 'Add Friend' } } ] } } 上面叙述的整个过程叫做Reconciliation(这个不知道怎么翻译,应该叫和谐?)。在React里,每次调用 那么我们来看看最开始的问题: // 方法定义 function add(x,2) // 组件定义 class Icon extends Component {} // 组件调用?????? <Icon /> 现在我们已经有了回答这个问题的全部知识,除了一点点以外。有个地方,你可能觉得奇怪在使用React的时候,从来没有用过 看看我们前面的例子: function Button({addFriend}) { return React.createElement( 'button','Add Friend' ) } function User({ name,addFriend }) { return React.createElement( "div",React.createElement( "p",name ),{ addFriend }) ) } 写成JSX的样子是这样的: function Button({addFriend}) { return ( <button onClick={addFriend}>Add Friend</button> ) } function User({name,addFriend}) { return ( <div> <p>{name}</p> <Button addFriend={addFriend} /> </div> ) } 所以,最后我们应该怎么回答前面的问题呢? 应该叫做“创建element”,应为JSX最后会转码为 React.createElement(Icon,null) 前面的例子都是“创建一个React element”。 React.createElement( 'div',{ className: 'container' },'Hello!' ) <div className='container'>Hello!</div> <Hello /> 原文地址:https://tylermcginnis.com/rea... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |