位置: IT常识 - 正文

React入门笔记(react 入门)

编辑:rootadmin
React入门笔记 1、React入门<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <title>Document</title></head><body> <div id="app"></div> <script type="text/babel"> ReactDOM.render( <h1>hello world2</h1>, document.getElementById('app') ) </script></body></html>2、JSX语法<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <title>Document</title></head><body> <div id="app"></div> <script type="text/babel"> let a = '变量a' ReactDOM.render( <h1 className="h1">{a}</h1>, document.getElementById('app') ) </script></body></html>3、元素渲染<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <title>Document</title></head><style> .red{ color: red; }</style><body> <div id="app"></div> <script type="text/babel"> function test(){ //只会渲染变动的地方,而不会像js操作dom一样全部修改 let time = new Date().toLocaleTimeString() let template = <div> <h1 className="red">现在时间是</h1> <h2> {time} </h2> </div> ReactDOM.render( template, document.getElementById('app') ) } setInterval(test,1000) </script></body></html>4、组件和props传值<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <title>Document</title></head><body> <!-- React中的组件分为:无状态组件(函数式组件)和有状态组件(React.Component) 无状态组件:直接定义函数的形式,不存在state,只会有props,它没有生命周期 有状态组件:使用class定义,extend继承,由state进行数据的存储和管理,同时还可以有props,有生命周期 传值的时候有状态组件取用的是this.state.属性或者是this.props.属性 无状态组件的话使用的是props.属性 --></body></html>5、函数式组件<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <title>Document</title></head><body> <!-- React中的组件分为:无状态组件(函数式组件)和有状态组件(React.Component) 无状态组件:直接定义函数的形式,不存在state,只会有props,它没有生命周期 有状态组件:使用class定义,extend继承,由state进行数据的存储和管理,同时还可以有props,有生命周期 传值的时候有状态组件取用的是this.state.属性或者是this.props.属性 无状态组件的话使用的是props.属性 --> <div id="app1"></div> <script type="text/babel"> // 函数式组件 // function Hello(){ // return <h1>Hello World</h1> // } //多个元素一定要记得写根元素 function Hello(){ return <div> <h1>Hello World</h1> <h1>Hello World</h1> <h1>Hello World</h1> </div> } ReactDOM.render( <Hello/>, document.getElementById('app1') ) </script></body></html>6、函数是组件和props传值<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <title>Document</title></head><body> <!-- React中的组件分为:无状态组件(函数式组件)和有状态组件(React.Component) 无状态组件:直接定义函数的形式,不存在state,只会有props,它没有生命周期 有状态组件:使用class定义,extend继承,由state进行数据的存储和管理,同时还可以有props,有生命周期 传值的时候有状态组件取用的是this.state.属性或者是this.props.属性 无状态组件的话使用的是props.属性 --> <div id="app1"></div> <script type="text/babel"> // 函数式组件 // function Hello(){ // return <h1>Hello World</h1> // } //多个元素一定要记得写根元素 function Temp(props){ return <div> <h1>函数式组件,使用props传值</h1> <h1>姓名:{props.name}</h1> <h1>年龄: {props.age}</h1> </div> } ReactDOM.render( <Temp name='小明' age='18'/>, document.getElementById('app1') ) </script></body></html>7、有状态组件<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <title>Document</title></head><body> <!-- React中的组件分为:无状态组件(函数式组件)和有状态组件(React.Component) 无状态组件:直接定义函数的形式,不存在state,只会有props,它没有生命周期 有状态组件:使用class定义,extend继承,由state进行数据的存储和管理,同时还可以有props,有生命周期 传值的时候有状态组件取用的是this.state.属性或者是this.props.属性 无状态组件的话使用的是props.属性 --> <div id="root"></div> <script type="text/babel"> class Hello extends React.Component{ render(){ return <h1>Hello World</h1> } } ReactDOM.render( <Hello />, document.getElementById('root') ) </script></body></html>8、有状态组件props<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <title>Document</title></head><body> <!-- React中的组件分为:无状态组件(函数式组件)和有状态组件(React.Component) 无状态组件:直接定义函数的形式,不存在state,只会有props,它没有生命周期 有状态组件:使用class定义,extend继承,由state进行数据的存储和管理,同时还可以有props,有生命周期 传值的时候有状态组件取用的是this.state.属性或者是this.props.属性 无状态组件的话使用的是props.属性 --> <div id="root"></div> <script type="text/babel"> class Hello extends React.Component{ render(){ return <div> <h1>Hello World</h1> <p>姓名:{this.props.name}</p> <p>性别:{this.props.age}</p> </div> } } ReactDOM.render( <Hello age="18" name="小明"/>, document.getElementById('root') ) </script></body></html>9、事件处理<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <title>Document</title></head><body> <!-- React中的组件分为:无状态组件(函数式组件)和有状态组件(React.Component) 无状态组件:直接定义函数的形式,不存在state,只会有props,它没有生命周期 有状态组件:使用class定义,extend继承,由state进行数据的存储和管理,同时还可以有props,有生命周期 传值的时候有状态组件取用的是this.state.属性或者是this.props.属性 无状态组件的话使用的是props.属性 --> <div id="root"></div> <script type="text/babel"> class Hello extends React.Component{ constructor(props){ super(props) this.state = { name: "小李", age: 18 } } updateInfor = ()=>{ this.setState({ name: 'hello', age: 13 }) } render(){ return <div> <h1>Hello World</h1> <p>姓名:{this.state.name}</p> <p>性别:{this.state.age}</p> <button onClick={this.updateInfor}>更新数据</button> </div> } } ReactDOM.render( <Hello/>, document.getElementById('root') ) </script></body></html>10、事件处理this详解<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <title>Document</title></head><body> <!-- React中的组件分为:无状态组件(函数式组件)和有状态组件(React.Component) 无状态组件:直接定义函数的形式,不存在state,只会有props,它没有生命周期 有状态组件:使用class定义,extend继承,由state进行数据的存储和管理,同时还可以有props,有生命周期 传值的时候有状态组件取用的是this.state.属性或者是this.props.属性 无状态组件的话使用的是props.属性 --> <div id="root"></div> <script type="text/babel"> class Hello extends React.Component{ constructor(props){ super(props) this.state = { name: "小李", age: 18 } this.updateInfor1 = this.updateInfor1.bind(this) } updateInfor = ()=>{ this.setState({ name: 'hello', age: 13 }) } updateInfor1(){ this.setState({ name: 'hello', age: 13 }) } updateInfor2(){ this.setState({ name: 'hello', age: 13 }) } render(){ return <div> <h1>Hello World</h1> <p>姓名:{this.state.name}</p> <p>性别:{this.state.age}</p> {/* <button onClick={this.updateInfor}>更新数据</button> */} <button onClick={this.updateInfor1}>更新数据</button> <button onClick={this.updateInfor2.bind(this)}>更新数据</button> </div> } } ReactDOM.render( <Hello/>, document.getElementById('root') ) </script></body></html>11、列表渲染<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <title>Document</title></head><body> <!-- React中的组件分为:无状态组件(函数式组件)和有状态组件(React.Component) 无状态组件:直接定义函数的形式,不存在state,只会有props,它没有生命周期 有状态组件:使用class定义,extend继承,由state进行数据的存储和管理,同时还可以有props,有生命周期 传值的时候有状态组件取用的是this.state.属性或者是this.props.属性 无状态组件的话使用的是props.属性 --> <div id="root"></div> <script type="text/babel"> class Hello extends React.Component{ state = { list: [1,2,3,4,5] } render(){ const arr = this.state.list const lists = [] arr.forEach(i=>{ let li = <li> {arr[i-1]} </li> lists.push(li) }) return <div> <ul> {lists} </ul> </div> } } ReactDOM.render( <Hello/>, document.getElementById('root') ) </script></body></html>12、循环需要key<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <title>Document</title></head><body> <!-- React中的组件分为:无状态组件(函数式组件)和有状态组件(React.Component) 无状态组件:直接定义函数的形式,不存在state,只会有props,它没有生命周期 有状态组件:使用class定义,extend继承,由state进行数据的存储和管理,同时还可以有props,有生命周期 传值的时候有状态组件取用的是this.state.属性或者是this.props.属性 无状态组件的话使用的是props.属性 --> <div id="root"></div> <script type="text/babel"> class Hello extends React.Component{ state = { list: [1,2,3,4,5] } render(){ const arr = this.state.list const lists = [] arr.map((item, index)=>{ let li = <li key={index}> {item} </li> lists.push(li) }) return <div> <ul> {lists} </ul> </div> } } ReactDOM.render( <Hello/>, document.getElementById('root') ) </script></body></html>13、条件处理1<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <title>Document</title></head><body> <!-- React中的组件分为:无状态组件(函数式组件)和有状态组件(React.Component) 无状态组件:直接定义函数的形式,不存在state,只会有props,它没有生命周期 有状态组件:使用class定义,extend继承,由state进行数据的存储和管理,同时还可以有props,有生命周期 传值的时候有状态组件取用的是this.state.属性或者是this.props.属性 无状态组件的话使用的是props.属性 --> <div id="root"></div> <script type="text/babel"> function Login(){ return <button> Login </button> } function Logout(){ return <button> Logout </button> } class Hello extends React.Component{ state = { isLogin:true } render(){ const isLogin = this.state.isLogin let button if(isLogin){ button = Logout() }else{ button = Login() } return <div> {button} </div> } } ReactDOM.render( <Hello/>, document.getElementById('root') ) </script></body></html>14、条件处理2<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <title>Document</title></head><body> <!-- React中的组件分为:无状态组件(函数式组件)和有状态组件(React.Component) 无状态组件:直接定义函数的形式,不存在state,只会有props,它没有生命周期 有状态组件:使用class定义,extend继承,由state进行数据的存储和管理,同时还可以有props,有生命周期 传值的时候有状态组件取用的是this.state.属性或者是this.props.属性 无状态组件的话使用的是props.属性 --> <div id="root"></div> <script type="text/babel"> function Login(){ return <button> Login </button> } function Logout(){ return <button> Logout </button> } class Hello extends React.Component{ state = { isLogin:true } render(){ const {isLogin} = this.state let button return <div> {isLogin ? <Login/> : <Logout/>} </div> } } ReactDOM.render( <Hello/>, document.getElementById('root') ) </script></body></html>15、条件处理和事件处理组合<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="https://unpkg.com/react@17/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <title>Document</title></head><body> <!-- React中的组件分为:无状态组件(函数式组件)和有状态组件(React.Component) 无状态组件:直接定义函数的形式,不存在state,只会有props,它没有生命周期 有状态组件:使用class定义,extend继承,由state进行数据的存储和管理,同时还可以有props,有生命周期 传值的时候有状态组件取用的是this.state.属性或者是this.props.属性 无状态组件的话使用的是props.属性 --> <div id="root"></div> <script type="text/babel"> function Login(){ return <button> Login </button> } function Logout(){ return <button> Logout </button> } class Hello extends React.Component{ state = { isLogin:false } updataInfo = ()=>{ this.setState({ isLogin:!this.state.isLogin }) } render(){ const {isLogin} = this.state let button return <div> {isLogin ? <Login/> : <Logout/>} <button onClick={this.updataInfo}>更新数据</button> </div> } } ReactDOM.render( <Hello/>, document.getElementById('root') ) </script></body></html>
本文链接地址:https://www.jiuchutong.com/zhishi/300193.html 转载请保留说明!

上一篇:Redis高频面试题汇总(上)(redis面试必会6题经典)

下一篇:WEB核心【会话技术】第十五章(web2.0核心)

  • 淘宝店铺爆款多推广怎么做(淘宝店铺打造爆款的四个时期)

    淘宝店铺爆款多推广怎么做(淘宝店铺打造爆款的四个时期)

  • 推广网店事半功倍(网店网络推广)

    推广网店事半功倍(网店网络推广)

  • 苹果电脑自带键盘怎么打顿号(苹果电脑自带键盘在哪里打开)

    苹果电脑自带键盘怎么打顿号(苹果电脑自带键盘在哪里打开)

  • 用两年多手机很卡怎么办(用了两年半的手机)

    用两年多手机很卡怎么办(用了两年半的手机)

  • ipad时间限额怎么取消(ipad时间限额怎么设置不能忽略)

    ipad时间限额怎么取消(ipad时间限额怎么设置不能忽略)

  • 苹果充电头发烫厉害(苹果充电头发烫是线不好,还是头不好)

    苹果充电头发烫厉害(苹果充电头发烫是线不好,还是头不好)

  • 我国的手机号为什么是11位数字(我国使用的手机号码为11位数字)

    我国的手机号为什么是11位数字(我国使用的手机号码为11位数字)

  • 抖音上线能隐身吗(抖音上线能隐身吗怎么设置)

    抖音上线能隐身吗(抖音上线能隐身吗怎么设置)

  • vr眼镜是干什么

    vr眼镜是干什么

  • oppo能不能开双麦(oppo可不可以双开)

    oppo能不能开双麦(oppo可不可以双开)

  • ipadair和mini的区别(ipad mini 和ipad air有什么区别)

    ipadair和mini的区别(ipad mini 和ipad air有什么区别)

  • 怎么看淘宝用了多少年(怎么看淘宝用了多少优惠券)

    怎么看淘宝用了多少年(怎么看淘宝用了多少优惠券)

  • 无线网dns怎么设置可以提速(无线网dns设置哪个最好最快)

    无线网dns怎么设置可以提速(无线网dns设置哪个最好最快)

  • 淘宝下单时备注在哪填(淘宝下单时备注怎么填)

    淘宝下单时备注在哪填(淘宝下单时备注怎么填)

  • win10休眠按哪个键唤醒(won10休眠)

    win10休眠按哪个键唤醒(won10休眠)

  • 华为m5青春版与华为m5区别(华为m5青春版与荣耀x7哪个好)

    华为m5青春版与华为m5区别(华为m5青春版与荣耀x7哪个好)

  • 为什么公众号不能留言(为什么公众号不能置顶)

    为什么公众号不能留言(为什么公众号不能置顶)

  • 为什么打开手机就是新闻头条(为什么打开手机就是广告,怎么关闭)

    为什么打开手机就是新闻头条(为什么打开手机就是广告,怎么关闭)

  • 电脑开机弹出documents文件夹解决方法(电脑开机弹出documents文件夹)

    电脑开机弹出documents文件夹解决方法(电脑开机弹出documents文件夹)

  • deepin20隐藏文件怎么取消隐藏? deepin显示隐藏文件的方法(deepin隐藏分区)

    deepin20隐藏文件怎么取消隐藏? deepin显示隐藏文件的方法(deepin隐藏分区)

  • ansible命令  运维自动化工具(基于ansible的运维平台)

    ansible命令 运维自动化工具(基于ansible的运维平台)

  • MySQL-触发器(mysql触发器创建)

    MySQL-触发器(mysql触发器创建)

  • 帝国cms容易被黑吗(帝国cms真的很好用)

    帝国cms容易被黑吗(帝国cms真的很好用)

  • 税后经营净利润怎么求
  • 租办公室自己装修可以拆走吗
  • 工资走账是什么意思
  • 外聘人员需要申报个税吗
  • 一般纳税人附加税减免政策2023
  • 建筑业工会经费0.12% 怎么来的
  • 短期借款,应付票据,应付账款和应交税费属于
  • 小规模纳税人能开9个点的发票吗
  • 用现金购买的股票
  • 开具简易计税房租发票怎样填写增值税申报表
  • 使用空头支票被银行冻结
  • 员工领取产假工资怎么算
  • 新公司前几个月发工资
  • 增值税怎么查看
  • 税控系统全额抵扣增值税申报
  • 应付利润是会计科目吗
  • 工程项目预缴税金
  • 一般纳税人所有税率
  • 实收资本减值会计处理
  • 如何正确核算出租房屋所应交的房产税?
  • 固定资产处置要交所得税吗
  • 常见的linux系统磁盘
  • app data文件夹
  • 上年度的费用今年怎么算
  • 查账补交以前年度印花税分录
  • 有留抵税额怎么做分录
  • 一列火车穿过一条隧道,已知火车长450米,隧道长750米
  • 最贵的十张照片
  • thinkphp post
  • 注册教育培训机构需要哪些手续
  • st的电机库性能怎么样呢
  • Laravel 5.3 学习笔记之 安装
  • 应交税费应交增值税销项税额
  • 购进的样品怎样做账
  • phpcms邀请注册送积分
  • 保险费支出是什么意思
  • 免征和抵扣税额的区别
  • 裁员补偿金如何合理避税
  • 发工资时代扣房贷怎么办
  • SQLserver数据库的while附近有语法错误,应为AS
  • mysql常用表
  • mongodb 合并数据库
  • 微众银行的企业贷款好批吗
  • 有外币业务的银行
  • 进项票和销项票是什么意思
  • 企业支付的费用化的一般借款利息支出属于什么
  • 红冲更正的正确分录
  • 增值税普通发票税率
  • 什么是品种法?适用于什么范围?
  • 预缴所得税科目
  • 购进固定资产没有发票怎么入账
  • 疫情防控重点保障企业名单
  • 劳务公司成本核算方法一般选择哪个
  • 如何理解出口退税的意义
  • 社保逾期滞纳金和利息
  • 一次性付清的优缺点
  • 09年前的固定资产
  • 因质量原因无法退货
  • 固定资产处置如何申报企业所得税
  • vista技巧:更改电源默认按钮为关机
  • 多系统安装方法
  • Linux 下 (RedHat 9.0) JDK,Tomcat,MySQL的安装
  • cortanawin10在哪
  • linux find -a
  • centos挂载lun
  • 如何手动设置定位
  • win7系统有自带的杀毒软件吗
  • 怎么创建windows虚拟机
  • JQuery.Ajax()的data参数类型实例详解
  • node管理工具
  • 在github开源的项目有假的吗
  • python安装pip.whl
  • python爬虫框架怎么画
  • js 括号函数
  • jquery获取document对象
  • js布局与css布局
  • js prototype constructor
  • 安卓设备分辨率查看
  • 一个月可不可以瘦十斤
  • 苏通卡上海服务网点查询
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设