Browse Source

测试桥接

master
zhangjiming 4 months ago
parent
commit
eb7dbc273f
  1. 2
      public/index.html
  2. 4
      src/index.tsx
  3. 39
      src/pages/Measure.tsx

2
public/index.html

@ -3,7 +3,7 @@
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" /> <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no" />
<meta name="theme-color" content="#000000" /> <meta name="theme-color" content="#000000" />
<meta <meta
name="description" name="description"

4
src/index.tsx

@ -6,6 +6,7 @@ import reportWebVitals from './reportWebVitals';
import { import {
createHashRouter, createHashRouter,
createRoutesFromElements, createRoutesFromElements,
Navigate,
Route, Route,
RouterProvider, RouterProvider,
} from 'react-router-dom'; } from 'react-router-dom';
@ -19,8 +20,9 @@ import MeasureRecord from './pages/MeasureRecord';
const router = createHashRouter( const router = createHashRouter(
createRoutesFromElements( createRoutesFromElements(
<Route path="/"> <Route path="/">
<Route index element={<Navigate to="home/measure" />} />
<Route path="home" element={<App />}> <Route path="home" element={<App />}>
<Route path="measure" index element={<Measure />}></Route>
<Route path="measure" element={<Measure />}></Route>
<Route path="setting" element={<Setting />}></Route> <Route path="setting" element={<Setting />}></Route>
<Route path="bluetooth" element={<Bluetooth />}></Route> <Route path="bluetooth" element={<Bluetooth />}></Route>
<Route path="mine" element={<Mine />}></Route> <Route path="mine" element={<Mine />}></Route>

39
src/pages/Measure.tsx

@ -11,6 +11,24 @@ import { rail6001, railTypes } from '../utils/constant';
import RailTypeBtn from '../components/RailTypeBtn'; import RailTypeBtn from '../components/RailTypeBtn';
import { Picker } from 'antd-mobile'; import { Picker } from 'antd-mobile';
declare global {
interface Window {
ReactNativeWebView: { postMessage: (arg: string) => void };
funcMap: Record<string, any>;
bridgeCall: (func: string, args: any[]) => void;
}
}
window.funcMap = {
add: (a: number, b: number) => a + b,
sub: (a: number, b: number) => a - b,
};
window.bridgeCall = (func, ...args) => {
console.log(func, args);
const res = window.funcMap[func].apply(null, args);
console.log('res:', res);
};
export default function Measure() { export default function Measure() {
const navigate = useNavigate(); const navigate = useNavigate();
@ -19,6 +37,14 @@ export default function Measure() {
const [railPickerVisible, setRailPickerVisible] = useState(false); const [railPickerVisible, setRailPickerVisible] = useState(false);
const [railId, setRailId] = useState<(number | string | null)[]>([1]); const [railId, setRailId] = useState<(number | string | null)[]>([1]);
const onStartClick = () => {
if (typeof window.ReactNativeWebView !== 'undefined') {
// 发送消息给 React Native
window.ReactNativeWebView.postMessage(JSON.stringify(['add', 2, 3]));
} else {
console.log('当前环境不支持 React Native WebView');
}
};
const onSaveClick = () => { const onSaveClick = () => {
navigate('/measure/save'); navigate('/measure/save');
}; };
@ -31,7 +57,7 @@ export default function Measure() {
}, []); }, []);
function railName() { function railName() {
return railTypes.find(r => r.id === railId[0])?.name || ''
return railTypes.find(r => r.id === railId[0])?.name || '';
} }
return ( return (
@ -51,7 +77,7 @@ export default function Measure() {
gridStep={3} gridStep={3}
origin={{ x: 0, y: 20 }} origin={{ x: 0, y: 20 }}
pixelPerMm={window.innerWidth / 90} pixelPerMm={window.innerWidth / 90}
maxZoom={5}
maxZoom={8}
showGrid={true} showGrid={true}
showBenchmark={true} showBenchmark={true}
showAnalysis={false} showAnalysis={false}
@ -61,10 +87,7 @@ export default function Measure() {
ref={canvasRef} ref={canvasRef}
/> />
<div className="absolute left-1 bottom-1"> <div className="absolute left-1 bottom-1">
<RailTypeBtn
text={railName()}
onClick={() => setRailPickerVisible(true)}
/>
<RailTypeBtn text={railName()} onClick={() => setRailPickerVisible(true)} />
</div> </div>
</div> </div>
</div> </div>
@ -77,7 +100,9 @@ export default function Measure() {
</section> </section>
<section className="flex items-center gap-4 px-4 my-4"> <section className="flex items-center gap-4 px-4 my-4">
<div className="btn-contained rounded-md text-sm h-10 flex-1"></div>
<div className="btn-contained rounded-md text-sm h-10 flex-1" onClick={onStartClick}>
</div>
<div className="btn-contained rounded-md text-sm h-10 flex-1" onClick={onSaveClick}> <div className="btn-contained rounded-md text-sm h-10 flex-1" onClick={onSaveClick}>
</div> </div>

Loading…
Cancel
Save