page.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import Link from "next/link";
  2. import { Code } from "@/components/code";
  3. export const metadata = {
  4. title: "Data Binding | json-render",
  5. };
  6. export default function DataBindingPage() {
  7. return (
  8. <article>
  9. <h1 className="text-3xl font-bold mb-4">Data Binding</h1>
  10. <p className="text-muted-foreground mb-8">
  11. Connect UI components to your application data using JSON Pointer paths.
  12. </p>
  13. <h2 className="text-xl font-semibold mt-12 mb-4">JSON Pointer Paths</h2>
  14. <p className="text-sm text-muted-foreground mb-4">
  15. json-render uses JSON Pointer (RFC 6901) for data paths:
  16. </p>
  17. <Code lang="json">{`// Given this data:
  18. {
  19. "user": {
  20. "name": "Alice",
  21. "email": "alice@example.com"
  22. },
  23. "metrics": {
  24. "revenue": 125000,
  25. "growth": 0.15
  26. }
  27. }
  28. // These paths access:
  29. "/user/name" -> "Alice"
  30. "/metrics/revenue" -> 125000
  31. "/metrics/growth" -> 0.15`}</Code>
  32. <h2 className="text-xl font-semibold mt-12 mb-4">DataProvider</h2>
  33. <p className="text-sm text-muted-foreground mb-4">
  34. Wrap your app with DataProvider to enable data binding:
  35. </p>
  36. <Code lang="tsx">{`import { DataProvider } from '@json-render/react';
  37. function App() {
  38. const initialData = {
  39. user: { name: 'Alice' },
  40. form: { email: '', message: '' },
  41. };
  42. return (
  43. <DataProvider initialData={initialData}>
  44. {/* Your UI */}
  45. </DataProvider>
  46. );
  47. }`}</Code>
  48. <h2 className="text-xl font-semibold mt-12 mb-4">Reading Data</h2>
  49. <p className="text-sm text-muted-foreground mb-4">
  50. Use <code className="text-foreground">useDataValue</code> for read-only access:
  51. </p>
  52. <Code lang="tsx">{`import { useDataValue } from '@json-render/react';
  53. function UserGreeting() {
  54. const name = useDataValue('/user/name');
  55. return <h1>Hello, {name}!</h1>;
  56. }`}</Code>
  57. <h2 className="text-xl font-semibold mt-12 mb-4">Two-Way Binding</h2>
  58. <p className="text-sm text-muted-foreground mb-4">
  59. Use <code className="text-foreground">useDataBinding</code> for read-write access:
  60. </p>
  61. <Code lang="tsx">{`import { useDataBinding } from '@json-render/react';
  62. function EmailInput() {
  63. const [email, setEmail] = useDataBinding('/form/email');
  64. return (
  65. <input
  66. type="email"
  67. value={email || ''}
  68. onChange={(e) => setEmail(e.target.value)}
  69. />
  70. );
  71. }`}</Code>
  72. <h2 className="text-xl font-semibold mt-12 mb-4">Using the Data Context</h2>
  73. <p className="text-sm text-muted-foreground mb-4">
  74. Access the full data context for advanced use cases:
  75. </p>
  76. <Code lang="tsx">{`import { useData } from '@json-render/react';
  77. function DataDebugger() {
  78. const { data, setData, getValue, setValue } = useData();
  79. // Read any path
  80. const revenue = getValue('/metrics/revenue');
  81. // Write any path
  82. const updateRevenue = () => setValue('/metrics/revenue', 150000);
  83. // Replace all data
  84. const resetData = () => setData({ user: {}, form: {} });
  85. return <pre>{JSON.stringify(data, null, 2)}</pre>;
  86. }`}</Code>
  87. <h2 className="text-xl font-semibold mt-12 mb-4">In JSON UI Trees</h2>
  88. <p className="text-sm text-muted-foreground mb-4">
  89. AI can reference data paths in component props:
  90. </p>
  91. <Code lang="json">{`{
  92. "type": "Metric",
  93. "props": {
  94. "label": "Total Revenue",
  95. "valuePath": "/metrics/revenue",
  96. "format": "currency"
  97. }
  98. }`}</Code>
  99. <h2 className="text-xl font-semibold mt-12 mb-4">Next</h2>
  100. <p className="text-sm text-muted-foreground">
  101. Learn about <Link href="/docs/actions" className="text-foreground hover:underline">actions</Link> for user interactions.
  102. </p>
  103. </article>
  104. );
  105. }