发布于2021-05-30 12:25 阅读(1173) 评论(0) 点赞(9) 收藏(1)
React是一个用于构建用户界面的javaScript库,起源于facebook的内部项目,后续在13年开源了出来
新建挂载点
<div id="root"></div>
React的引用
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
创建React元素并渲染到页面
<script>
// 参数一:元素名称;参数二:元素属性;参数三:元素的子节点
const title = React.createElement('h1', null, 'Hello React')
// 参数一:要渲染的react元素;参数二:挂载点
ReactDOM.render(title, document.getElementById('root'))
</script>
初始化项目
npx create-react-app myreact
npm start
删除 src 目录下的 所有文件,然后创建 index.js 文件
导入react和react-dom两个包
import React from 'react'
import ReactDOM from 'react-dom'
创建元素
let h1 = React.createElement('h1', null, 'Hello 初辰')
渲染到页面
ReactDOM.render(h1, document.getElementById('root'))
使用 createElement() 方法创建复杂 dom 结构
const ul = React.createElement('ul', null,
React.createElement('li', null, 'Hello'),
React.createElement('li', null, 'React'),
React.createElement('li', null,
React.createElement('span', null, '我是'),
React.createElement('span', null, '初辰')
)
)
使用 JSX 语法创建复杂 dom 结构
const ul =
<ul>
<li>Hello</li>
<li>React</li>
<li>
<span>我是</span>
<span>初辰</span>
</li>
</ul>
由于通过 createElement() 方法创建的 React 元素有一些问题,代码比较繁琐,结构不直观,无法一眼看出描述的结构,不优雅,用户体验不爽
JSX是JavaScript XML 的简写,表示在JavaScript代码中写HTML格式的代码
优势:声明式语法更加直观,与HTML结构相同,降低了学习成本,提升开发效率
使用JSX语法创建react元素
let h1 = <h1>初辰通过JSX创建的元素</h1>
使用ReactDOM来渲染元素
ReactDOM.render(h1,document.getElementById('root'))
/>
来结束JSX是来描述页面的结构,一般在编写业务逻辑渲染页面的时候,需要涉及到传递值,调用函数,判断条件,循环等,这一些在JSX中都能得到支持
语法:
{JavaScritp表达式}
例子:
let content = '插入的内容'
let h1 = <h1>初辰通过JSX创建的元素+ {content}</h1>
根据不同的条件来渲染不同的JSX结构
let isShow = false
let text = ''
if (isShow === true) {
text = '初辰1'
} else {
text = '初辰2'
}
写JSX的条件渲染与我们之前编写代码的逻辑是差不多的,根据不同的判断逻辑,返回不同的 JSX结构,然后渲染到页面中
let arr = [
{id:1,name:'三国演义'},
{id:2,name:'水浒传'},
{id:3,name:'西游记'},
{id:4,name:'红楼梦'}
]
let ul = (<ul>
{arr.map(item => <li key={item.id}>{item.name}</li>)}
</ul>)
ReactDOM.render(ul,document.getElementById('root'))
行内样式 -style
在style里面我们通过对象的方式传递数据
let ul = (<ul style={{ 'color': 'red', "backgroundColor": 'pink' }}>
{arr.map(item => <li key={item.id}>{item.name}</li>)}
类名 -className
创建CSS文件 index.css 编写样式代码
.container {
text-align: center;
color: rgb(124, 11, 11);
background-color: rgb(105, 105, 243);
}
在js中进行引入,然后设置类名即可
import './index.css'
let ul = (<ul className='container'>
{arr.map(item => <li key={item.id}>{item.name}</li>)}
</ul>)
function Hello () {
return (
<div>这是初辰的第一个函数组件</div>
)
}
利用ReactDOM.render()进行渲染
ReactDOM.render(<Hello />, document.getElementById('root'))
class Hello extends React.Component {
render () {
return (
<div>这是初辰的第一个类组件</div>
)
}
}
通过ReactDOM进行渲染
ReactDOM.render(<Hello />,document.getElementById('root'))
创建Hello.js, 在Hello.js 中导入React,创建组件,在Hello.js中导出
import React from 'react'
class fn extends React.Component {
render () {
return (
<div>单独抽离出来的 Hello</div>
)
}
}
export default fn
在index.js中导入Hello组件,渲染到页面
import ReactDOM from 'react-dom';
import Hello from './hello'
ReactDOM.render(<Hello />, document.getElementById('root'))
class Hello extends React.Component {
clickHandle () {
console.log('点击了')
}
render () {
return (
<button onClick={this.clickHandle}>点我点我点我</button>
)
}
}
stopPropagation()
和 preventDefault()
nativeEvent
属性来进行获取 clickHandle (e) {
console.log(e.nativeEvent)
}
事件 | 事件名 | 属性 |
---|---|---|
Clipboard Events 剪切板事件 | onCopy onCut onPaste | DOMDataTransfer clipboardData |
compositionEvent 复合事件 | onCompositionEnd onCompositionStart onCompositionUpdate | string data |
Keyboard Events 键盘事件 | onKeyDown onKeyPress onKeyUp | number keyCode |
Focus Events 焦点事件 | onFocus onBlur | DOMEventTarget relatedTarget |
Form Events 表单事件 | onChange onInput onInvalid onSubmit | |
Mouse Events 鼠标事件 | onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp | |
Pointer Events 指针事件 | onPointerDown onPointerMove onPointerUp onPointerCancel onGotPointerCapture onLostPointerCapture onPointerEnter onPointerLeave onPointerOver onPointerOut | |
Selection Events 选择事件 | onSelect | |
Touch Events 触摸事件 | onTouchCancel onTouchEnd onTouchMove onTouchStart | |
UI Events UI 事件 | onScroll | |
Wheel Events 滚轮事件 | onWheel | number deltaMode number deltaX number deltaY number deltaZ |
Media Events 媒体事件 | onAbort onCanPlay onCanPlayThrough onDurationChange onEmptied onEncrypted onEnded onError onLoadedData onLoadedMetadata onLoadStart onPause onPlay | |
Image Events 图像事件 | onLoad onError | |
Animation Events 动画事件 | onAnimationStart onAnimationEnd onAnimationIteration |
state基本使用
state = {
count: 0
}
render () {
return (
<div>计数器 :{this.state.count}</div>
)
}
setState() 修改状态
addCount = () => {
this.setState({
count: this.state.count + 1
})
}
render () {
return (
<div>
<div>计数器 :{this.state.count}</div>
<button onClick={this.addCount}>+1</button>
</div>
)
}
class App extends React.Component {
render () {
return (
<div>接收到的数据:{this.props.text}</div>
)
}
}
ReactDOM.render(<App text={'Hello Word'} />, document.getElementById('root'))
特点
class App extends React.Component {
render () {
return (
<div>接收到的数据:{this.props.text}</div>
)
}
}
ReactDOM.render(<App text={'Hello Word'} />, document.getElementById('root'))
class Fat extends React.Component {
getSonMsg = (msg) => {
console.log(msg);
}
render () {
return (
<Son getMsg={this.getSonMsg} />
)
}
}
class Son extends React.Component {
handleClick = () => {
this.props.getMsg('子元素的值')
}
render () {
return (
<button onClick={this.handleClick}>点我传值</button>
)
}
}
ReactDOM.render(<Fat />, document.getElementById('root'))
如果出现层级比较多的情况下(例如:爷爷传递数据给孙子),我们会使用Context来进行传递
使用步骤
调用 React.createContext() 创建 Provider(提供数据) 和 Consumer(消费数据) 两个组件
const {Provider,Consumer} = React.createContext()
使用Provider 组件作为父节点,设置value属性,表示要传递的数据
<Provider value="李白"><Node /></Provider>
哪一层想要接收数据,就用Consumer进行包裹,在里面回调函数中的参数就是传递过来的值
<Consumer>{data => <span>子节点--{data}</span>}</Consumer>
function Fat (props) {
return (
<div>组件的子节点:{props.children}</div>
)
}
ReactDOM.render(<Fat>初辰</Fat>, document.getElementById('root'))
import PropTypes from 'prop-types'
Fat.propTypes = {
name: PropTypes.string
}
原文链接:https://blog.csdn.net/chuenst/article/details/117223100
作者:西小口到了吗
链接:http://www.qianduanheidong.com/blog/article/116121/1ad9cd20f58e994164ac/
来源:前端黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 前端黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-3
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!