react基础,操作属性样式事件。事件处理this指向问题,及案例

news/2024/7/15 18:33:51 标签: react.js, 前端, javascript

1.1 React 起源于 Facebook 于2013年5月开源.
是一个用于构建用户界面的 JavaScript 库, 与vue,angular并称前端三大框架,现在最新版本是18

特点:-数据驱动(操作数据) - 组件化 - 虚拟DOM

开发环境:

  • cdn引入js

<script src="./node_modules/react/umd/react.development.js"></script>
    <script src="./node_modules/react-dom/umd/react-dom.production.min.js"></script>
    <script src="./node_modules/babel-standalone/babel.js"></script>

  • 脚手架
  • webpack手动搭建

第一个react程序:

javascript"><body>
    <div id="root">
         
    </div>
    <!-- 必须要按这个顺序引入 -->
    <script src="../lib/react.development.js"></script>
    <script src="../lib//react-dom.development.js"></script>
    <script src="../lib/babel.js"></script>

    <script type="text/babel">
        const message="我的第一个React"
        const user={name:'jack',age:18}
        const element=(
            <div>
                <h2>{message}</h2>
                <p>{user.name}-{user.age}</p>
           </div>
        )
        ReactDOM.render(element,document.getElementById('root'))
</script>
</body>

如果要在element里面写注释的话:{/*我是注释  */}

jsx语法:

    在以上的代码中,其实我们已经运用 jsx语法,那jsx语法到底是什么呢?

- 必须只能有一个根节点
- 多标签换行显示时写到一个小括号中 
- 单标签不能省略结束标签。/>
- 遇到 HTML 标签 (以 < 开头) 就用 HTML 规则解析
- 遇到代码块(以 { 开头),就用 JavaScript 规则解析
- JSX 允许直接在模板中插入一个 JavaScript 表达式
 

 react操作元素内容,样式,属性,事件

javascript">  <body>
    <div id="root"></div>
    <!-- 必须要按这个顺序引入 -->
    <script src="../lib/react.development.js"></script>
    <script src="../lib//react-dom.development.js"></script>
    <script src="../lib/babel.js"></script>

    <script type="text/babel">
      const title = "react元素操作";
      const url = "http://www.baidu.com";
      const pic =
        "https://img0.baidu.com/it/u=1472391233,99561733&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1676394000&t=ab66e9b81c775a97854704a561505508";
      const style1 = { color: "pink", backgroundColor: "red", width: "200px" };

      const isOk = true;

      function bindHander(){
        console.log('触发事件')
      }
      const element = (
        <div>
          {/*操作内容*/}
          <h2>{title}</h2>
          {/*操作属性*/}
          <a href={url}>百度</a>
          {/*操作属性,样式*/}
          <img src={pic} style={{ height: "100px" }} />
          {/*操作样式方法二*/}
          <p style={style1}>这是操作我的样式</p>
          {/*三元运算*/}
          {isOk ? "成功" : "失败"}
            {/*操作事件*/}
          <button style={{height:'30px',width:'60px'}} onClick={bindHander}></button>
        </div>
      );
      ReactDOM.render(element, document.getElementById("root"));
    </script>
  </body>

 Fragments:React 中的一个常见模式是一个组件返回多个元素。Fragments 允许你将子列表分组,而无需向 DOM 添加额外节点。

javascript">render(){
return (
<React.Fragment>

//此处相当于是模版字符串

</React.Fragment>
)}

 

组件:函数组件,类组件

函数组件:

  • 定义函数的第一个字母大写
  • 可以定义一个props形参。用于从外部向组件内传入数据
  • 组件内返回描述UI界面的React元素,按jsx语法实现

类组件:

  • 继承React.Component
  • render方法返回描述UI界面的React元素

State:

操作组件内部状态数据,使用state
注: 在hooks出现之前,只能在类组件中使用
 1. 获取state数据  this.state.***
 2. 更新state数据  this.setState({age:20})

 

事件处理&this指向问题:

语法:
on+事件类型名= {事件处理函数}
如: onClick={()=>{}}
    onFocus, onInput ...
注: 使用箭头函数,避免this指向问题

javascript"><body>
    <div id="root"> </div>

    <script type="text/babel">

        class EventDemo extends React.Component {
            constructor(props) {
                super(props)
                this.state = {
                    count: 0
                }

                // 绑定事件
                // this.bindPlus = this.bindPlus.bind(this)
            }
            render() {
                return (
                    <React.Fragment>
                        <h2>事件处理</h2>
                        <p>count: {this.state.count}</p>
                        {/* 第一种事件处理方式 */}
                        {/*<button onClick={this.bindPlus.bind(this)}>加一</button>*/}

                        {/* 第二种事件处理方式 */}
                        {/*<button onClick={this.bindPlus}>加一</button>*/}

                        {/* 第三种事件处理方式 */}
                        {/*<button onClick={ this.bindPlus}>加一</button>*/}

                        {/* 第四种事件处理方式 */}
                        <button onClick={ ()=>{this.bindPlus(10)}}>加一</button>

                    </React.Fragment>
                )
            }
            
            bindPlus = (num) => {
                this.setState({ count: num })
            }
        }

        ReactDOM.render(<EventDemo />, document.getElementById('root'))
    </script>
</body>

</html>

案例:

javascript"><body>
    <div id="root"></div>
    <script src="../lib/react.development.js"></script>
    <script src="../lib/react-dom.development.js"></script>
    <script src="../lib/babel.js"></script>


    <script type ="text/babel" >
        class Welcom extends React.Component {
          constructor(props) {
            super(props)
            this.state = {
             list:[
              { id: "1001", name: "C++", price: 89 },
              { id: "1002", name: "C", price: 39 },
              { id: "1003", name: "java", price: 56 }
            ],
            inputValue:''
            }
          }
          render() {
           return(
            <React.Fragment>
                <input type="text" placeholder='请输入书名' value={this.state.inputValue} onInput={this.bindInputValue}/>
                <button onClick={this.bindAddConfirm}>确定</button>
                {this.state.list.map((item,index)=>{
                    return(
                        <div key={item.id}>
                            <input type='checkbox' checked={item.state} onChange={()=>{
                                this.bindChange(item.id)
                            }}/>

                            {item.id}-{item.name}  

                            <input type="button" value='删除' onClick={()=>{
                                this.bindDelete(index)
                            }}/>

                            {item.state?'选中':'未选中'}  
                        </div>
                    )
                })}
              
            </React.Fragment>
           )
          }

          bindInputValue=(e)=>{
             const inputValue=e.target.value
             this.setState({inputValue})
          }

          bindAddConfirm=()=>{
            const {inputValue,list} =this.state
            list.push({
                id:Math.floor(Math.random)*10,
                name:inputValue,
                state:false
            })
            // 更新
            this.setState({inputValue:'',list})
          }

        //   删除
        bindDelete=(index)=>{
            const {list} =this.state
            list.splice(index,1)
            this.setState({list})
        }
        // 单选
        bindChange=(id)=>{
            const isChecked=event.target.value
            const {list}=this.state
            const book=list.find(item=>item.id===id)
            book.state=!book.state
            this.setState({list})
        }

        };
      ReactDOM.render(<Welcom />, document.getElementById("root"))
    </script>
  </body>


http://www.niftyadmin.cn/n/63390.html

相关文章

【csdn首发】全网爆火的从零到一落地接口自动化测试

前段时间写了一系列自动化测试相关的文章&#xff0c;当然更多的是方法和解决问题的思路角度去阐述我的一些观点。结合我自己实践自动化测试的一些经验以及个人理解&#xff0c;这篇文章来聊聊新手如何从零到一落地实践接口自动化测试。 为什么要做接口测试 测试理念的演变 早…

Linux管道字符转换命令:tr、col、join、paste、expand

tr tr命令可以用来删除一段信息当中的文字&#xff0c;或是进行文字信息的替换 tr 【-ds】SET1 ... 选项与参数&#xff1a; -d&#xff1a;删除信息中的SET1这个字符 -s&#xff1a;替换掉重复的字符 这个命令也可以写到正则表达式中&#xff0c;因为它是由正则表达式来替换…

Urho3D 事件Events

在脚本中&#xff0c;子系统通过以下全局财产可用&#xff1a;时间、文件系统、日志、缓存、网络、输入、ui、音频、引擎、图形、渲染器、脚本、控制台、debugHud、数据库。请注意&#xff0c;由于WorkQueue和Profiler的低级性质&#xff0c;它们不可用于脚本。 事件本身不需要…

python迭代器与iter()函数实例教程

本文介绍了python迭代器与iter()函数的用法&#xff0c;Python 的迭代无缝地支持序列对象&#xff0c;而且它还允许程序员迭代非序列类型&#xff0c;包括用户定义的对象。 迭代器是在版本 2.2 被加入 Python 的&#xff0c;它为类序列对象提供了一个类序列的接口。 序列是一组…

9. QML_OpenGL--2. 在QQuick中搭建加载OpenGL框架

1. 说明&#xff1a; OPenGL一般在 QtWidget 中使用&#xff0c;但目前使用 QML 做界面开发是一种趋势&#xff0c;同时在QML中使用OPenGL进行渲染也是十分必要&#xff0c;文章简单介绍如何在QML中使用 OPenGL&#xff0c;搭建了一种基本的框架。整体思路和在 QtWidget 中类似…

Hudi-基本概念(时间轴、文件布局、索引、表类型、查询类型、数据写、数据读、Compaction)

文章目录基本概念时间轴(TimeLine)文件布局&#xff08;File Layout&#xff09;Hudi表的文件结构Hudi存储的两个部分Hudi的具体文件说明索引&#xff08;Index&#xff09;原理索引选项全局索引与非全局索引索引的选择策略对事实表的延迟更新对事件表的去重对维度表的随机更删…

Java开发学习(五十)----MyBatisPlus快速开发之代码生成器解析

1、代码生成器原理分析 造句: 我们可以往空白内容进行填词造句&#xff0c;比如: 在比如: 观察我们之前写的代码&#xff0c;会发现其中也会有很多重复内容&#xff0c;比如: 那我们就想&#xff0c;如果我想做一个Book模块的开发&#xff0c;是不是只需要将红色部分的内容全部…

Centos7对磁盘扩容(亲测有效)

Centos7新增磁盘扩容方法&#xff1a;对LVM根分区扩容1&#xff0c;查看现有分区[rootdongjjpc /]# df -h文件系统 容量 已用 可用 已用% 挂载点devtmpfs 3.8G 0 3.8G 0% /devtmpfs 3.9G 0 3.9G 0% /dev/shmtmpfs 3.9G 12M 3.8G 1% /runtmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup/de…