项目背景:2013年,净美仕的企业门户,基本功能参见 www.codeboy.com:9999/mfresh/
早期技术选型:采用的“前后端不分离”的技术方案 —— 静态文件(.html)和动态文件(.php)共处于同一个Web服务器中,目前看来已经略显过时了,性能不足,PHP已经处于消亡的边缘。
项目重构:采用的“前后端分离”的技术架构 —— 静态文件(.html)运行于的Apache或Nginx服务器,后端接口(.php或.node或.java)用对应的后端服务器。技术选型:
后台接口:暂时先用之前的.php接口,后期改写为.node+express编写RESTful API
前端界面:React + React-Router-Dom + fetch + 自定义组件库
======================
public:静态资源托管目录,不会被Webpack打包处理,而是直接发布到服务器中,客户端浏览器可以直接使用文件路径来访问 —— 用于放置项目中的动态图片,例如:用户头像、商品评论图片…
src:源代码目录,里面的文件只有被Webpack打包后(必须被其它模块依赖)才能发布到服务器中,否则外界无法访问 —— 用于放置项目中的静态图片,例如:logo、各种小图标…
Vue.js中的路由导航模块:Vue-Router
小程序中的路由导航: pages.json + 五种跳转API
uni-app中的路由导航: pages.json + 五种跳转API
React中的路由导航模块:
基于浏览器的项目(网站/H5等): react-router-dom
脱离浏览器的项目(ReactNative): react-navigation
React中基于浏览器的项目,实现SPA应用必需的路由导航模块:react-router-dom
官网手册: https://reactrouter.com/en/main/start/tutorial
使用方法:
npm i react-router-dom
import {RouterProvider, createBrowserRouter } from 'react-router-dom'
let r = createBrowserRouter([
{path: '/login', element: <Login/> },
{path: '/regiseter', element: <Register/>},
.......
{path: '/*", element: <NotFound/>}
])
let root = ReactDOM.createRoot(document.getElementById('root'))
root.render( <RouterProvider router={r}/> )
<Link to="跳转地址"></Link>
useNavigate( )
let loc = useLocation( )
//{ pathname: 路由地址, search: 查询字符串 }
let x = useSearchParams( )
React官方没有提供异步数据请求方案;可以使用现有的已知的任何技术;官方示例使用的是fetch。
fetch:抓取,用于客户端浏览器抓取服务器端接口数据;是W3C委员会为HTML5新增的异步请求技术,目的在于“取代XHR”。
使用手册: https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API/Using_Fetch
使用fetch发起GET请求—Promise
let url = 'http://www.codeboy.com:9999/news?nid=2'
//异步请求服务器端接口数据,返回一个Promise
let promise1 = fetch( url )
promise1.then(res=>{ //res: response,响应消息对象
//clg(res.status) 响应状态码
//clg(res.headers) 响应消息头部
//clg(res.body) 响应消息主体(ReadableStream)
//如果开发者确认服务器返回的主体是JSON字符串的话,使用JSON.parse()方法对主体进行解析即可
let promise2 = res.json( ) //读取响应消息主体,完成后进行JSON解析
promise2.then(data=>clg(data)).catch(err=>clg(err))
}).catch(err=>clg(err))
使用fetch发起GET请求—await(推荐使用)
let url = 'http://www.codeboy.com:9999/news?nid=2'
//异步请求服务器端接口数据,返回一个Promise
let res = await fetch( url )
let data = await res.json( ) //读取响应消息主体,完成后进行JSON解析
clg(data)
使用fetch发起POST请求—await(推荐使用)
let url = 'http://www.codeboy.com:9999/login'
let options = {
method: 'POST',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: 'uname=yaya&upwd=123'
}
//异步请求服务器端接口数据,返回一个Promise
let res = await fetch( url, options )
let data = await res.json( ) //读取响应消息主体,完成后进行JSON解析
clg(data)
父组件的数据传递给子组件 —— Props Down
//父组件(Parent.js)
function Parent(){
let [newsList] = useState([....])
return <Child list={newsList} />
}
-----------
//子组件(Child.js)
function Child( props ){
clg( props.list ) //值就是父组件中的newsList
}
子组件的数据传递给父组件 —— Props Up
//父组件(Parent.js)
function Parent(){
function showPage( n ){ //clg(n) }
return <Child f2={showPage}/>
}
-----------
//子组件(Child.js)
function Child( props ){
let num = 3 //要传递给父组件的数据
props.f2( num ) //在子组件体内调用父组件的方法,实参是子组件的数据
}
Vue.js | 小程序/uni-app | React | |
---|---|---|---|
innerText绑定 | <div v-text="表达式"></div> | <div>{{表达式}}</div> | <div>{表达式}</div> |
innerHTML绑定 | <div v-html="表达式"></div> | <rich-text :nodes={表达式}></rich-text> | <div dangerouslySetInnerHTML={ {__html:表达式} }></div> //React提供的“友好提示”:innerHTML绑定的内容一定要安全 |
Vue.js中:
方法① <template></template>
方法② <block></block>
React中:
方法① <></>
方法② <React.Fragment></React.Fragment> 片段
{ /* JSX注释 */ }
{
// JSX注释
}