知名做网站的公司,义务教育标准化建设网站,厦门seo代理商,个人微商城怎么开通react 中的函数组件底层渲染原理
react组件没有局部与全局之分#xff0c;它是一个整体。这点跟vue的组件化是不同的。要实现 react 中的全局组件#xff0c;可以将组件挂在react上#xff0c;这样只要引入了react#xff0c;就可以直接使用该组件。
函数式组件的创建
…react 中的函数组件底层渲染原理
react组件没有局部与全局之分它是一个整体。这点跟vue的组件化是不同的。要实现 react 中的全局组件可以将组件挂在react上这样只要引入了react就可以直接使用该组件。
函数式组件的创建
创建一个函数函数中返回一个jsx或者jsx元素virtualdom。基于 es6 的模块导入导出方式将函数作为模块的导出.可以忽略后缀名。
Component /
Component.../Component命名首字母大写大驼峰命名。小写字母开头编译器会认为这是一个标签编译器也会报错。
关于 props 属性的细节知识
函数组件不能使用this关键字。函数组件不能使用生命周期钩子。子组件的props属性不能直接修改。获取子组件的props属性需要使用props.xxx。
对象的冻结密封和不可扩展
被冻结的对象不能添加、删除或修改其属性。也不能劫持对象。Object.defineProperty方法不能修改这些属性。Object.isFrozen方法用来检测对象是否被冻结。被密封的对象的属性可以修改值但是不能添加、删除。但不能劫持对象。Object.isSealed方法用来检测对象是否被密封。不可扩展的对象除了不能新增成员其他操作都正常。Object.isExtensible方法用来检测对象是否可以扩展。
总结: 被冻结的对象既是不可扩展的也是密封的。被密封的也是不可扩展的。
所以我们在组件内部修改props属性时需要先拷贝一份然后才能修改。否则会报错。
组件的默认值
函数组件.defaultProps属性可以设置组件的默认值。
function Jsx({ name }) {return (divJsxhr /p{name}/p/div);
}Jsx.defaultProps { name: zs22222222 };
export default Jsx;函数的类型校验
函数组件.propTypes属性可以设置组件的默认值。 需要我们安装prop-types库。 跟Component组件一样需要使用import导入。
import PropTypes from prop-types;
Child.defaultProps { name: zs22222222, age: 18 };
Child.propTypes {name: PropTypes.string,age: PropTypes.oneOfType([PropTypes.number.isRequired,PropTypes.string,PropTypes.bool,]),
};函数组件中的插槽处理 插槽的作用就是将父组件中的内容原封不动的传递给子组件。想办法让组件更加灵活具有更强的复用性 数据值用属性 html 片段用插槽 children 属性传递子组件的jsx元素,是数组的情况下要使用下面的方式来接收也可以使用React.Children里面的方法来进行处理 插槽内容可以根据不同的需求放到不同的位置。
静态组件和动态组件
function Vote() {function handleSubmit() {}function handleCancel() {}return (div classNamevote-boxdiv classNameheaderh2 classNametitle标题/h2span15人/span/divdiv classNamemainp支持人数: 10人/pp反对人数: 5人/p/divdiv classNamefooterbutton onClick{handleSubmit} classNamebtn btn-primary支持/buttonbutton onClick{handleCancel} classNamebtn btn-danger反对/button/div/div);
}
export default Vote;第一次渲染组件执行函数产生一个私有的上下文把解析出来的 props 包括 children 属性保存到上下文,并冻结了props属性不可修改。返回一个jsx元素的vdom。渲染jsx元素生成virtualdom。 当我们点击按钮再次渲染组件时 修改上下文中的变量私有作用于发生了变化但是视图不会更新。所以称为静态组件。 除非在父组件中修改了子组件的props属性才会重新渲染。 动态组件:实际项目中我们会遇到在第一次渲染组件完成后需要基于组件内部的状态变化让组件可以更新以呈现出不同的页面效果。 动态组件(class 组件hooks 组件) 2、 初始化状态 状态:后期修改状态可以触发视图的更新 需要手动初始化如果我们没有去做相关的处理则默认会往实例上挂载一个state初始值是null this,statenull 手动处理:
state {xxx:xxx
}修改状态控制视图更新this.state.xxxxxx :这种操作仅仅是修改了状态值但是无法让视图更新想让视图更新我们需要基于React.Component.prototype提供的方法操作:「推荐」
1 this.setstate(partialstate)既可以修改状态也可以让视图更新partialstate:部分状态 this.setstate({xxx:xxx
})2 this.forceUpdate()强制更新 forceUpdate在类组件中生效的使用方法当你必须使用这个api页面才更新的时候说明你的业务代码中就已经出现了问题了。如果我们是基于 this.forceUpdate()强制更新视图会跳过 shouldcomponentUpdate 周期函数的校验直接从willUpdate开始进行更新这时视图就一定会更新。
import { Component } from react;
class Vote extends Component {state {oppPerson: 0,aggPerson: 0,};handleSubmit() {}handleCancel () {this.state.oppPerson; //这种使用是不对的this.forceUpdate();};render() {const { oppPerson, aggPerson } this.state;return (div classNamevote-boxdiv classNameheaderh2 classNametitle标题/h2span15人/span/divdiv classNamemainp支持人数: {aggPerson}人/pp反对人数: {oppPerson}人/p/divdiv classNamefooterbutton onClick{this.handleSubmit} classNamebtn btn-primary支持/buttonbutton onClick{this.handleCancel} classNamebtn btn-danger反对/button/div/div);}
}
export default Vote;父子组件的更新顺序
vue中 react中