反应本机深度链接路由不起作用
React native deep linking routing not working
我正在使用动态链接进行深度链接。
const linking = {
prefixes: [
www.example.com
],
config: {
screens: {
Chat: {
path: ":id",
parse: {
id: (id) => `${id}`,
},
},
Profile: 'user',
},
},
};
function App() {
return (
<NavigationContainer linking={linking} fallback={<Text>Loading...</Text>}>
<Stack.Screen name="Chat" component={ChatScreen} />
<Stack.Screen name="Profile" component={ProfileScreen} />
</NavigationContainer>
);
}
www.example.com/user
总是路由到 ChatScreen
屏幕。我想在 ProfileScreen
中路由。如何在链接中处理配置文件?
将您的config
设置为
const config = {
screens: {
Profile: '/user',
Chat:'/chat/:id'
},
};
你的linking
应该是
const linking = {
prefixes: [
'www.example.com',
],
config,
};
这样做,www.example.com/user
将被路由到 ProfileScreen
组件。 www.example.com/chat/:<some id>
将带您到 ChatScreen
,路由参数为 id
。
更新:您似乎正试图通过 www.example.com/<some id>
转到 ChatScreen
并且还 www.example.com/user
加载 ProfileScreen
.问题是 React 导航将字符串 "user"
视为参数 id
并将您带到 ChatScreen
本身。这就是我在 ChatScreen
.
路径中添加“聊天”的原因
如果真的要用www.example.com/<some id>
加载ChatScreen
,可以用getStateFromPath
,自己写逻辑来区分ids和路径名。为此,您的 linking
将是
const linking = {
prefixes: [
'www.example.com',
],
config,
getStateFromPath: (path, options) => {
if (path ==='/user') {
return {routes: [{ name: 'Profile' }],
} ;
} else {
return {routes: [{ name: 'Chat',params:{id:getIdFromPath(path)} }],
} ;
}
},
};
此处checkIfValidPath
用于检查url路径是否为实际id
或“用户”。 getIdFromPath
是从url中提取id。我还没有测试过这个,但这应该可以。
const checkIfValidPath=(path)=>{
return path !=='www.example.com/user';
}
const getIdFromPath =(path)=>{
return path.slice(1, path.length);
}
这对我有用
const getIdFromPath = (path) => { return path.slice(1, path.length); }
const linking = {
prefixes: [
www.example.com
],
config: {
screens: {
Chat: {
path: ":id",
parse: {
id: (id) => `${id}`,
},
},
Profile: 'user',
},
},
getStateFromPath: (path, options) => {
if (path === '/user') {
return { routes: [{ name: 'Profile' }], };
}
else {
return { routes: [{ name: 'Chat', params: { id: getIdFromPath(path) } }], };
}
}
};
function App() {
return (
<NavigationContainer linking={linking} fallback={<Text>Loading...</Text>}>
<Stack.Screen name="Chat" component={ChatScreen} />
<Stack.Screen name="Profile" component={ProfileScreen} />
</NavigationContainer>
);
}
我正在使用动态链接进行深度链接。
const linking = {
prefixes: [
www.example.com
],
config: {
screens: {
Chat: {
path: ":id",
parse: {
id: (id) => `${id}`,
},
},
Profile: 'user',
},
},
};
function App() {
return (
<NavigationContainer linking={linking} fallback={<Text>Loading...</Text>}>
<Stack.Screen name="Chat" component={ChatScreen} />
<Stack.Screen name="Profile" component={ProfileScreen} />
</NavigationContainer>
);
}
www.example.com/user
总是路由到 ChatScreen
屏幕。我想在 ProfileScreen
中路由。如何在链接中处理配置文件?
将您的config
设置为
const config = {
screens: {
Profile: '/user',
Chat:'/chat/:id'
},
};
你的linking
应该是
const linking = {
prefixes: [
'www.example.com',
],
config,
};
这样做,www.example.com/user
将被路由到 ProfileScreen
组件。 www.example.com/chat/:<some id>
将带您到 ChatScreen
,路由参数为 id
。
更新:您似乎正试图通过 www.example.com/<some id>
转到 ChatScreen
并且还 www.example.com/user
加载 ProfileScreen
.问题是 React 导航将字符串 "user"
视为参数 id
并将您带到 ChatScreen
本身。这就是我在 ChatScreen
.
如果真的要用www.example.com/<some id>
加载ChatScreen
,可以用getStateFromPath
,自己写逻辑来区分ids和路径名。为此,您的 linking
将是
const linking = {
prefixes: [
'www.example.com',
],
config,
getStateFromPath: (path, options) => {
if (path ==='/user') {
return {routes: [{ name: 'Profile' }],
} ;
} else {
return {routes: [{ name: 'Chat',params:{id:getIdFromPath(path)} }],
} ;
}
},
};
此处checkIfValidPath
用于检查url路径是否为实际id
或“用户”。 getIdFromPath
是从url中提取id。我还没有测试过这个,但这应该可以。
const checkIfValidPath=(path)=>{
return path !=='www.example.com/user';
}
const getIdFromPath =(path)=>{
return path.slice(1, path.length);
}
这对我有用
const getIdFromPath = (path) => { return path.slice(1, path.length); }
const linking = {
prefixes: [
www.example.com
],
config: {
screens: {
Chat: {
path: ":id",
parse: {
id: (id) => `${id}`,
},
},
Profile: 'user',
},
},
getStateFromPath: (path, options) => {
if (path === '/user') {
return { routes: [{ name: 'Profile' }], };
}
else {
return { routes: [{ name: 'Chat', params: { id: getIdFromPath(path) } }], };
}
}
};
function App() {
return (
<NavigationContainer linking={linking} fallback={<Text>Loading...</Text>}>
<Stack.Screen name="Chat" component={ChatScreen} />
<Stack.Screen name="Profile" component={ProfileScreen} />
</NavigationContainer>
);
}