React 系列教程 1:实现 Animate.css 官网效果

前言

这是 React 系列教程的第一篇,我们将用 React 实现 Animate.css 官网的效果。对于 Animate.css 官网效果是一个非常简单的例子,原代码使用 jQuery 编写,就是添加类与删除类的操作。这对于学习 React 来说是一个非常简易的例子,但是我并不会在教程中介绍相关的前置知识,比如 JSX、ES6 等,对于小白来说可能还会有一些困惑的地方,所以还要了解一下 React 相关的基础知识。虽然 React 有很多值得深究的知识,但这个系列教程并不会涉及高大深的内容。

预告一下,在下一篇教程中,我会使用 React + Redux,编写一个元胞自动机兰顿蚂蚁的程序。

效果演示

本教程以实现 Animate.css 官网效果为主,不会去调整样式细节,所以视觉上略显朴素。以下是最终完成的效果:

See the Pen react-animate-css by Zongbin (@nzbin) on CodePen.

因为这个案例效果非常简单,对于已经熟悉 React 的新手来说,完全可以尝试自己编写实现,甚至略过本篇教程。

开始吧

编写 HTML 结构

整个教程采用 ES6 语法编写,无法直接在浏览器预览,所以需要使用 Babel 编译一下,大家可以使用官方的 create-react-app 脚手架搭建开发环境。但是对于本教程而言,我推荐大家使用 CodePen 在线平台编写,简单直接,不需要复杂的环境配置。

啰嗦一句,在现代化的前端编程中,所有的页面 HTML 元素几乎都是写在 JS 中,这确实更有利于 DOM 操作。与传统前端开发一样,我们同样先把 HTML 结构写出来,先看一看基本的雏形,然后再一点一点把事件添加上去。代码如下:

class App extends React.Component{
  
  render (){
    return (
      <div>
        <h1>Animate.css</h1>
        <select>
          <optgroup label="Attention Seekers">
            <option value="bounce">bounce</option>
            <option value="flash">flash</option>
            <option value="pulse">pulse</option>
            <option value="rubberBand">rubberBand</option>
            <option value="shake">shake</option>
            <option value="swing">swing</option>
            <option value="tada">tada</option>
            <option value="wobble">wobble</option>
            <option value="jello">jello</option>
          </optgroup>

          // ...省略其它动画选项

        </select>
        <input type="button" value="Animate it"/>
      </div>
    )
  }
}

ReactDOM.render(<App />, document.getElementById('container'));

对于熟悉 ES6 语法的朋友,上面的写法不难理解,我们写了一个 React 组件以及一个渲染输出语句。

关于状态

React 和 jQuery(传统前端编程)的最大不同在于 DOM 操作的方式,React 通过状态变化来更新 DOM,而传统方式则使用事件更新 DOM。但是 React 的状态变化简单来说也要依靠事件驱动。所以对于小白来说不要有太多的思想包袱。上一篇文章《如何在已有的 Web 应用中使用 ReactJS》通过更简单的示例介绍了 React 和 jQuery 的不同之处,感兴趣的同学可以详细了解一下。按照 React 官方规范,我们用以下方法添加状态:

class App extends React.Component{
  constructor(props){
    super(props);
    this.state = {
      selected:''
    }
  }
}

添加事件

jQuery 添加事件的方式是获取引用元素,然后绑定事件,而 React 则是通过 JSX(可以简单理解为模板字符串)直接在元素上绑定事件。这种方式和 DOM 0 级绑定事件的方式类似,但是并不相同。

添加事件之前,我们先看一下需要哪些事件。首先,我们需要给选择框添加 change 事件,用于在切换动画时添加一个动画类。另外,当动画结束时我们需要把动画类移除,所以需要绑定一个 animationend 事件。最后,给 Animate it 按钮添加一个 click 事件,点击按钮,重新添加动画类。

以下是添加事件之后的代码:

class App extends React.Component{
  constructor(props){
    super(props);
    this.state = {
      selected:''
    }
    this.animationName = 'bounce';
  }
  
  handleChange = (e)=>{
    this.setState({
      selected: e.target.value
    });
    
    this.animationName = e.target.value;
  }
  
  handleAnimationEnd = (e)=>{
    this.setState({
      selected: ''
    });
  }
  
  handleClick = (e)=>{
    this.setState({
      selected: this.animationName
    });
  }
  
  render (){
    return (
      <div>
        <h1 className={`animated ${this.state.selected}`} onAnimationEnd={this.handleAnimationEnd}>Animate.css</h1>
        <select onChange={this.handleChange} >

          // ...省略动画选项
          
        </select>
        <input type="button" value="Animate it" onClick={this.handleClick}/>
      </div>
    )
  }
}

ReactDOM.render(<App />, document.getElementById('container'));

添加完事件之后,整个教程基本就结束了,或许我的代码并不是最好的。对于刚开始接触 React 或者 JS 基础不太扎实的同学,需要重点理解一下事件绑定时 this 的指代问题,以上代码使用了箭头函数来解决 this 的指代问题,还可以使用 bind 方法。对于涉及动画的问题,还要了解 animationendtransitionend 两个事件。

总结

本教程属于 React 非常基础的使用独立状态的例子,没有任何其它复杂的概念,所以非常适合新手。强调一点,本人并不精通 React,也是以一个学习者的姿态写这篇教程。因为 React 并不是我现在重点研究的技术,所以现阶段不想花过多的时间与精力去学习,但还是希望这个简易的系列教程可以帮助想要学习 React 的新人。除了原创教程之外,我在之前也翻译过两篇非常优秀的实战教程,感兴趣的同学可以翻出来学习一下。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏haifeiWu与他朋友们的专栏

复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

27640
来自专栏Ken的杂谈

【系统设置】CentOS 修改机器名

17830
来自专栏微信公众号:小白课代表

不只是软件,在线也可以免费下载百度文库了。

不管是学生,还是职场员工,下载各种文档几乎是不可避免的,各种XXX.docx,XXX.pptx更是家常便饭,人们最常用的就是百度文库,豆丁文库,道客巴巴这些下载...

44030
来自专栏前端桃园

知识体系解决迷茫的你

最近在星球里群里都有小伙伴说道自己对未来的路比较迷茫,一旦闲下来就不知道自己改干啥,今天我这篇文章就是让你觉得一天给你 25 个小时你都不够用,觉得睡觉都是浪费...

20240
来自专栏钱塘大数据

中国互联网协会发布:《2018中国互联网发展报告》

在2018中国互联网大会闭幕论坛上,中国互联网协会正式发布《中国互联网发展报告2018》(以下简称《报告》)。《中国互联网发展报告》是由中国互联网协会与中国互联...

13450
来自专栏FSociety

SQL中GROUP BY用法示例

GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

5.1K20
来自专栏怀英的自我修炼

考研英语-1-导学

英二图表作文要重视。总体而言,英语一会比英语二难点。不过就写作而言,英语二会比英语一有难度,毕竟图表作文并不好写。

11510
来自专栏腾讯社交用户体验设计

ISUX Xcube智能一键生成H5

50920
来自专栏腾讯高校合作

【倒计时7天】2018教育部-腾讯公司产学合作协同育人项目申请即将截止!

15420
来自专栏钱塘大数据

理工男图解零维到十维空间,烧脑已过度,受不了啦!

让我们从一个点开始,和我们几何意义上的点一样,它没有大小、没有维度。它只是被想象出来的、作为标志一个位置的点。它什么也没有,空间、时间通通不存在,这就是零维度。

28430

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励