web

AntD学习笔记 第一章 基础知识

2018-11-15  本文已影响0人  Leanisme

1.1 前端开发的演变

  1. 静态页面阶段:后端 MVC模式,前端即V
  2. AJAX 阶段:实现了(获取数据 => 处理数据 => 展示数据)完整业务逻辑
  3. 前端 MVC 阶段:MVVM,View-Model数据处理,简化版的Controller。
  4. SPA 阶段:开发页面 => 开发前端应用,代表框架: Vue、Angular、React
    总结:
    React:网页组件的解决方案,任何应用架构都可以采用
    antd 基于 React 框架,采用 Redux 架构,进行封装后大大了简化开发工作量

1.2 初始化环境

本课程的工程目录结构

目录结构.png
为什么需要脚手架:存在编译过程,需要编译工具搭建

编译工具:umi(同时也是前端框架,对社区的 webpack、react-router 等进行封装)

开发环境:安装 nodejs(js 执行环境);使用以下代码测试是否安装成功
node -v
npm -v
安装 cnpm 获得更快速、更安全的包管理体验;
npm install -g cnpm --registry=https://registry.npm.taobao.org
···cnpm···
使用npm install -g yarn模块化 安装了yarn
安装 umi 依赖,即
cnpm init 初始化 package.json(nodejs 约定的用来存放项目信息和配置信息的文件);
cnpm install umi --save-dev 或者 yarn global add umi(让依赖信息保存到 package.json 中的 dependencise 里,这里dev代表开发时使用。这些模块在我们的项目部署后是不需要的,所以我们可以使用 --save-dev 的形式安装。像 express 这些模块是项目运行必备的,应该安装在 dependencies 节点下,所以我们应该使用 -save 的形式安装。)

我们也可以直接使用 create umi 命令构建完整项目:
mkdir test-dva-umi-app & cd test-dva-umi-app
yarn create umi
然后,选择你需要的功能进行安装,如图所示。


安装.png

回车确定后,会根据选择自动创建好目录和文件。此时的目录结构如下图所示。


目录.png
安装依赖,启动项目
yarn 或 npm install
yarn start 或 npm start

第一个页面:配置文件被约定为 config/config.js,初始化的内容如下:export default {};;
新建 src 目录用来存放配置和单测以外的代码,可以使用export default {singular: true,}修改pages文件夹为page;
在package.json 中的 script 里添加命令,命令可以在根目录中通过 cnpm run "scriptname"来运行;

{
  "scripts": {
   "dev": "umi dev",
   "build": "umi build"
  }
}

新建 src/page/HelloWorld.js 文件,代码如下:

export default () => {
  return <div>hello world</div>;
}

这时通过 cnpm run dev 即可编译项目,编译完成会提示访问地址,会自动打开浏览器访问。


image

但是访问是会提示404找不到路径,这是因为没有配置路由
在配置文件 config/config.js 中添加配置路由,其中 component 是一个字符串,是相对于 page 目录的相对路径,这样我们默认访问页面就是HelloWorld了

export default {
  routes: [{
    path: '/',
    component: './HelloWorld',
  }],
}

添加umi-plugin-react插件集

执行cnpm install umi-plugin-react --save-dev
修改config.js

export default {
  plugins: [
    ['umi-plugin-react', {
      // 这里暂时还没有添加配置,该插件还不会有作用,我们会在后面的课程按照需求打开相应的配置
    }],
  ],
  routes: [{
    path: '/',
    component: './HelloWorld',
  }],
}

cnpm 安装的依赖会被默认安装到项目的 node_modules 目录下。这个目录通常是不需要提交到代码仓库中的。如果你使用的是 git 来作为代码的管理工具,那么你可以添加 .gitignore 文件到项目根目录中,避免将不必要的代码提交到 git 仓库中。
.gitignore 如下:
node_modules
dist
.umi
其中 .umi 是 umi 在开发过程中产生的临时入口文件,便于开发调试,同样也不需要提交到代码仓库中。dist 是构建出来的产物,通常也不需要提交。
我们建议你可以在本地通过 git 管理起你的代码,方便在后面的课程中更好的操作你的代码。
git init
git add -A
git commit -m 'init'

通过 cnpm run build 来构建出最终的产物,执行该命令后会生成最终的 HTML、CSS 和 JS 到 dist 目录下。它们是浏览器可以直接识别并运行的代码,这样你就可以将它们部署到你想要的服务器上了。

1.3 尝试组件

组件的概念

上一节的HelloWorld就是一个组件,一张网页可以由多个互相独立的功能单位组成,这种功能单位就叫做“组件”(component)。组件内部还可以包含下一级的组件。
组件的好处 :

jsx语法

JSX 语法的特点就是,凡是使用 JavaScript 的值的地方,都可以插入这种类似 HTML 的语法。
注意:1.所有 HTML 标签必须是闭合的2. 只能有一个根元素

//没有闭合语法的标签,必须在标签尾部加上斜杠,比如
<img src="" />

// 报错,有两个根元素
const element = <h1>hello</h1><h1>world</h1>;
// 不报错,将两个根元素用一个组件包起来
const element = <div><h1>hello</h1><h1>world</h1></div>;

HTML 原生标签使用小写,自定义的组件标签首字母大写
允许js与jsx混写,{}进入js上下文

const element = (
  <h1>
    Hello, {formatName(user)}!
  </h1>
);

组件定义

继承React.Component基类,重写render方法

import React from 'react';
class ShoppingList extends React.Component {
  render() {
    return (
      <div className="shopping-list">
        <h1>Shopping List for {this.props.name}</h1>
        <ul>
          <li>Instagram</li>
          <li>WhatsApp</li>
          <li>Oculus</li>
        </ul>
      </div>
    );
  }
}
export default ShoppingList;

上面代码定义了一个 ShoppingList 组件。自定义的组件必须继承React.Component这个基类,然后必须有一个render方法,给出组件的输出。export 输出的是class,名称要对上

组件的使用

import React from 'React';
import ShoppingList from './shoppinglist.js';
class Content extends React.Component {
  render() {
return (
  //无内容闭合标签
      <ShoppingList name="张三" />
 //有内容标签
      <ShoppingList name="张三">
          {/* 插入的其他内容 */}
       </ShoppingList>
    );
  }
}
export default Content;

标签属性传值:this.props
该组件包含一个name参数
<h1>Shopping List for {this.props.name}</h1>
组件内部,所有参数都放在this.props属性上面。通过this.props.name就可以拿到传入的值(张三)。
标签内容传值:this.props.children
this.props对象有一个特殊的参数this.props.children,表示当前组件“包裹”的所有内容(类似innerHTML)。比如,上面代码里面的Shopping List for {this.props.name},就是<h1>元素的this.props.children。在 React 里面意味着组件内部可以拿到用户在组件里面放置的内容。
下面是一个组件,内部使用props.children,获取用户传入的内容。

import React from 'React';
const Picture = (props) => {
  return (
    <div>
      <h1>this is pic page</h1>
      <img src={props.src} />
      {props.children}
    </div>
  )
}
class Content extends React.Component {
  render () {
    //类似static函数,定义常量
    const picture = {
        src: 'http://img2.imgtn.bdimg.com/it/u=2914548178,2707730282&fm=200&gp=0.jpg',
    };
    return (
    <div className='container'>
      <Picture src={picture.src}>
        这里放置的内容就是 props.children
      </Picture>
    </div>
    )
  }
}
export default Content;

组件内部状态:this.state
除了接受外部参数,组件内部也有不同的状态,组件的内部状态记录在this.state这个对象上面。

import React from 'React';
class Square extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      value: 'Y',
    };
  }

  render() {
    return (
      <button
        className="square"
        onClick={() => this.setState({value: 'X'})}
      >
        {this.state.value}
      </button>
    );
  }
}
export default Square;

上面代码中,组件Square的构造方法constructor里面定义了当前状态this.state对象。Square 组件的这个对象只有一个value属性,一开始的值是Y。
用户点击按钮以后,onClick监听函数执行this.setState()方法。React 使用这个方法,更新this.state对象。这个方法有一个特点,就是每次执行以后,它会自动调用render方法,导致 UI 更新。UI 里面使用this.state.value,输出状态值。随着用户点击按钮,页面就会显示X。

组件生命周期

以下组件只有在初始化的时候才调用。

componentWillMount,在渲染前调用,在客户端也在服务端。

以下组件只在更新的时候才被调用,初始化时不调用。

标记的为常用方法

上一篇 下一篇

猜你喜欢

热点阅读