React组件的正确打开姿势,以及jsx中style样式写法
原创
©著作权归作者所有:来自51CTO博客作者JediHongbin的原创作品,请联系作者获取转载授权,否则将追究法律责任
React组件的两种创建方式
注意点 引入的组件的名首字母要大写,组件文件要先引入React
构造函数式接收属性要用形参接收,class式不需要,用this.props.xxx获取,class还有类似vue中的data的属性,this.state={};class式必须有render ,render要有返回值,constructor中要先super()然后在进行操作格式如下
构造函数式 无状态组件(用的不多)
import React from 'react'
export default function hello (props) {
return <h2>{props.name}-{props.age}</h2>
}
引入
let age = 20
let name = "hongbin"
let skill = ['Vue','React']
let hongbin = {
age,name,skill
}
const myDiv = <div id="wrap">
<h1>Hello React</h1>
<Hello {...hongbin}></Hello>
</div>
ReactDom.render(myDiv,document.getElementById("app"))
class式 有状态组件(推荐,有生命周期,私有数据)
import React from 'react'
export default class Hi extends React.Component {
constructor(){
super()
this.state = {
hi:"hi"
}
}
render(){
return <div>
{this.state.hi}<br/>
{this.props.skill.map(i => <h3 key={i}>{i}</h3>)}
</div>
}
}
引入同构造函数式
两种组件形式各有各的优势
构造函数式因为没有生命周期和私有属性,所以速度更快,性能高,适合没有私有值的情况使用
class式组件有生命周期和私有属性,适合用于对值需要操作获取等情况
两者可以相互配合使用
webpack.config.js配置引入时省略文件后缀名和@别名
resolve:{//省去js文件中导入文件的后缀名
extensions:['.js','.jsx','.json'], //表示引入的文件自动匹配后缀名从数组中的第一项开始匹配
alias:{//别名
'@':path.join(__dirname ,'./src')//表示@代表根目录下的src目录
}
}
这样引入组件时不需要像这样
import Hello from './components/hello.jsx'
可以这样代替
import Hello from './components/hello'
import Hello from '@/components/hello'
两种组件方式配合使用
比如要对一组数据进行渲染,只用class的方式可以写成
class CommentsWrap extends React.Component {
constructor() {
super()
this.state = {
lists: [
{ id: 1, user: 'Peter', content: 'Hi i am Peter' },
{ id: 2, user: 'David', content: 'Hi i am David' },
{ id: 3, user: 'Paul', content: 'Hi i am Paul' },
{ id: 4, user: 'Lisa', content: 'Hi i am Lisa' },
{ id: 5, user: 'Caesar', content: 'Hi i am Caesar' },
],
}
}
render() {
return (
<div>
{this.state.lists.map((list, index) => {
return (
<div key={index}>
<h3>评论人:{list.user}</h3>
<h4>评论内容:{list.content}</h4>
</div>
)
})}
</div>
)
}
}
可以看到整体分为两个部分,一部分是需要渲染的数据,一部分是return到页面的jsx标签
可以看到return出去的jsx部分数据是来自组件的state中的值,本身不需要自己私有的值,这样我们就可以把他抽离成一个单独的组件,这样index.js文件中只需要放处理出去的组件就可以了
index.js
import CommentsWrap from '@/components/CommentWrap'
ReactDom.render(
<div>
<CommentsWrap></CommentsWrap>
</div>,
document.getElementById('app')
)
CommentsWrap组件
import CommentList from '@/components/CommentList'
export default class CommentsWrap extends React.Component {
constructor() {
super()
this.state = {
lists: [
{
id: 1,
user: 'Peter',
content: 'Hi i am Peter',
},
{
id: 2,
user: 'David',
content: 'Hi i am David',
},
{
id: 3,
user: 'Paul',
content: 'Hi i am Paul',
},
{
id: 4,
user: 'Lisa',
content: 'Hi i am Lisa',
},
{
id: 5,
user: 'Caesar',
content: 'Hi i am Caesar',
},
],
}
}
render() {
return (
<div>
{this.state.lists.map((list, index) => {
return <CommentList key={index} {...list}></CommentList>
})}
</div>
)
}
}
CommentList组件
export default function CommentList(props) {
return (
<div>
<h3> 评论人: {props.user} </h3>
<h4> 评论内容: {props.content} </h4>
</div>
)
}
这样每个块单独抽出来,更易于日后代码的维护,也符合模块化开发潮流
jsx的样式
jsx的样式书写格式:
style = {{color:"deepPink"}}
样式的4次抽离
1,
<div style = {{padding:"0.6rem" ,border:"0.0625rem dashed #00f",maxWidth:"50vw",margin:"0.625rem auto"}}>
<h3 style = {{color:"deepPink"}}> 评论人: {props.user} </h3>
<h4 style = {{color:"green"}}> 评论内容: {props.content} </h4>
</div>
2
let wrap = {padding:"0.6rem" ,border:"0.0625rem dashed #00f",maxWidth:"50vw",margin:"0.625rem auto"}
let user = {color:"deepPink"}
let context = {color:"green"}
export default function CommentList(props) {
return (
<div style = {wrap}>
<h3 style = {user}> 评论人: {props.user} </h3>
<h4 style = {context}> 评论内容: {props.content} </h4>
</div>
)
}
3
let style = {
wrap : {padding:"0.6rem" ,border:"0.0625rem dashed #00f",maxWidth:"50vw",margin:"0.625rem auto"},
user : {color:"deepPink"},
context : {color:"green"}
}
export default function CommentList(props) {
return (
<div style = {style.wrap}>
<h3 style = {style.user}> 评论人: {props.user} </h3>
<h4 style = {style.context}> 评论内容: {props.content} </h4>
</div>
)
}
4
import style from '@/components/style'
export default function CommentList(props) {
return (
<div style = {style.wrap}>
<h3 style = {style.user}> 评论人: {props.user} </h3>
<h4 style = {style.context}> 评论内容: {props.content} </h4>
</div>
)
}
components/style.js
export default {
wrap : {padding:"0.6rem" ,border:"0.0625rem dashed #00f",maxWidth:"50vw",margin:"0.625rem auto"},
user : {color:"deepPink"},
context : {color:"green"}
}
最后如果本文对你有用的话欢迎你关注我的公众号,会有各种技术栈的文章