Releases: reactive-python/reactpy
reactpy v2.0.0b6
All changes from v2.0.0b5 with a few additions:
- Fix
HOOK_STACKerrors - Remove
keyattribute from VDOM spec (Fix #1284) - Add
reactpy.html(...)shorthand notation for HTML fragments. - Add
reactpy.hshorthand alias forreactpy.html. - Add
reactpy.reactjs.component_from_npm - Deprecate
reactpy.web.* - Move
component_from_*functions intoreactpy.reactjs.* - Allow for all ReactPy and ReactJS components to be arbitrarily inserted into each other (Fix #1262)
reactpy v2.0.0b5
All changes from v2.0.0b4 with a few additions:
- Bump minimum Python version to 3.11
- Support Python 3.14
- Better error message if ASGI dependencies are missing
- Removed
reactpy.types.ContextProviderTypetop-level export. Usereactpy.types.ContextProviderinstead. - Removed
reactpy.types.LayoutTypetop-level export. Usereactpy.types.BaseLayoutinstead. - No longer require a package
namewithinreactjs_component_from_* - Remove
pipdependency - Convert
orjsoninto an ASGI only dependency - Fix
@reactpy/client's dependency path forevent-to-object - Fix #1001 (Create a better custom JS interface)
- Fix #624 (Refactor layout rendering)
- Fix #1198 (use_effect's unmount method is not always called with dynamically rendered children)
- Fix #1201 (de-duplicate async renders)
event-to-object v1.0.1
Add warning if user provided input was not a JSON serializable root object. These non-serializable values are now passed through as-is.
@reactpy/client v1.0.1
- Fix error when a user provided JavaScript component transmits event data that isn't JSON structured.
- Re-export
preactwithin top-level module to assist with version synchronization.
reactpy v2.0.0b4
All changes from v2.0.0b3 with a few additions:
- Improve type hints on
reactjs_component_from_* - Remove
jsonpointerdependency use_effectwill now generate an exception if attempting to use an async function. Useuse_async_effectinstead- Remove deprecated
Stopexception type - Remove deprecated
hotswapfunction - Remove top-level export of
reactpy.Layout. Usereactpy.core.layout.Layoutinstead.
event-to-object v1.0.0
Complete re-write to add more robust translation of events to plain JSON objects.
@reactpy/client v1.0.0
Complete re-write to support ReactPy v2.
reactpy v2.0.0b3
Summary
Welcome to the beta release of ReactPy v2, which brings ReactPy Standalone Mode, and ReactPy ASGI Middleware!
You can give this version a try by typing pip install reactpy[asgi]==2.0.0b3.
Here is a quick demo of the new ReactPy Standalone mode:
# FILENAME: example.py
from reactpy import component, html
from reactpy.executors.asgi import ReactPy
@component
def ExampleComponent():
return html.div("Hello World")
app = ReactPy(ExampleComponent)
# Now you can run `uvicorn example:app --reload` to start ReactPy!Here is a quick demo of the new ReactPy Middleware mode (using Starlette for demonstration purposes):
# FILENAME: example.py
from starlette.applications import Starlette
from starlette.routing import Route
from starlette.templating import Jinja2Templates
from reactpy.executors.asgi import ReactPyMiddleware
# You will need to follow your framework's guidelines on installing Jinja extensions
# When our new Jinja extension is installed, the `{% component "example.path" %}` tag will be available in any Jinja template.
# The template tag currently accepts a single argument, which is the dotted path to the component.
# For example {% component "my_package.ExampleComponent" %}
templates = Jinja2Templates(
directory="templates",
extensions=["reactpy.templatetags.Jinja"],
)
async def homepage(request):
return templates.TemplateResponse(request, "index.html")
app = ReactPyMiddleware(
Starlette(routes=[Route("/", homepage)]),
# Register components with ReactPy to allow them to be used as a root component in your templates
root_components=["my_package.ExampleComponent"],
)
# Now you can run `uvicorn example:app --reload` to start ReactPy!Changelog
Added
- Added
reactpy.executors.asgi.ReactPythat can be used to run ReactPy in standalone mode via ASGI. - Added
reactpy.executors.asgi.ReactPyCsrthat can be used to run ReactPy in standalone mode via ASGI, but rendered entirely client-sided. - Added
reactpy.executors.asgi.ReactPyMiddlewarethat can be used to utilize ReactPy within any ASGI compatible framework. - Added
reactpy.templatetags.ReactPyJinjathat can be used alongsideReactPyMiddlewareto embed several ReactPy components into your existing application. This includes the following template tags:{% component %},{% pyscript_component %}, and{% pyscript_setup %}. - Added
reactpy.pyscript_componentthat can be used to embed ReactPy components into your existing application. - Added
asgiandjinjainstallation extras (for examplepip install reactpy[asgi, jinja]). - Added support for Python 3.12 and 3.13.
- Added
reactpy.use_async_effecthook. - Added
shutdown_timeoutparameter to thereactpy.use_async_effecthook. reactpy.htmlwill now automatically flatten lists recursively (ex.reactpy.html(["child1", ["child2"]]))- Added
reactpy.Vdomprimitive interface for creating VDOM dictionaries. - Added type hints to
reactpy.htmlattributes. - Added support for nested components in web modules
- Added support for inline JavaScript as event handlers or other attributes that expect a callable via
reactpy.types.InlineJavaScript - Added
reactpy.web.reactjs_component_from_fileto import ReactJS components from a file. - Added
reactpy.web.reactjs_component_from_urlto import ReactJS components from a URL. - Added
reactpy.web.reactjs_component_from_stringto import ReactJS components from a string. - Event functions can now call
event.preventDefault()andevent.stopPropagation()methods directly on the event data object, rather than using the@eventdecorator. - Event data now supports accessing properties via dot notation (ex.
event.target.value).
Changed
- Substitute client-side usage of
reactwithpreact. - Script elements no longer support behaving like effects. They now strictly behave like plain HTML script elements.
- The
reactpy.htmlmodule has been modified to allow for auto-creation of any HTML nodes. For example, you can create a<data-table>element by callinghtml.data_table(). - Change
set_statecomparison method to check equality with==more consistently. - Add support for rendering
@componentchildren withinvdom_to_html. - Renamed the
use_locationhook'ssearchattribute toquery_string. - Renamed the
use_locationhook'spathnameattribute topath. - Renamed
reactpy.config.REACTPY_DEBUG_MODEtoreactpy.config.REACTPY_DEBUG. @reactpy/clientnow exportsReactandReactDOM.- ReactPy no longer auto-converts
snake_caseprops tocamelCase. It is now the responsibility of the user to ensure that props are in the correct format. reactpy.utils.reactpy_to_stringwill now retain the user's original casing fordata-*andaria-*attributes.reactpy.utils.string_to_reactpyhas been upgraded to handle more complex scenarios without causing ReactJS rendering errors.reactpy.core.vdom._CustomVdomDictConstructorhas been moved toreactpy.types.CustomVdomConstructor.reactpy.core.vdom._EllipsisReprhas been moved toreactpy.types.EllipsisRepr.reactpy.types.VdomDictConstructorhas been renamed toreactpy.types.VdomConstructor.- Rewrite the
event-to-objectpackage to be more robust at handling properties on events.
Deprecated
reactpy.web.exportis deprecated. Usereactpy.web.reactjs_component_from_*instead.reactpy.web.module_from_fileis deprecated. Usereactpy.web.reactjs_component_from_fileinstead.reactpy.web.module_from_urlis deprecated. Usereactpy.web.reactjs_component_from_urlinstead.reactpy.web.module_from_stringis deprecated. Usereactpy.web.reactjs_component_from_stringinstead.
Removed
- Removed the ability to import
reactpy.html.*elements directly. You must now callhtml.*to access the elements. - Removed
reactpy.samplemodule. - Removed
reactpy.svgmodule. Contents previously withinreactpy.svg.*can now be accessed viahtml.svg.*. - Removed
reactpy.html._function. Usehtml.fragmentinstead. - Removed
reactpy.run. See the documentation for the new method to run ReactPy applications. - Removed
reactpy.backend.*. See the documentation for the new method to run ReactPy applications. - Removed
reactpy.core.typesmodule. Usereactpy.typesinstead. - Removed
reactpy.utils.html_to_vdom. Usereactpy.utils.string_to_reactpyinstead. - Removed
reactpy.utils.vdom_to_html. Usereactpy.utils.reactpy_to_stringinstead. - Removed backend specific installation extras (such as
pip install reactpy[starlette]). - Removed deprecated function
module_from_template. - Removed support for Python 3.9.
- Removed support for async functions within
reactpy.use_effecthook. Usereactpy.use_async_effectinstead. - Removed
reactpy.vdom. Usereactpy.Vdominstead. - Removed
reactpy.core.make_vdom_constructor. Usereactpy.Vdominstead. - Removed
reactpy.core.custom_vdom_constructor. Usereactpy.Vdominstead.
Fixed
- Fixed a bug where script elements would not render to the DOM as plain text.
- Fixed a bug where the
keyproperty provided within server-side ReactPy code was failing to propagate to the front-end JavaScript components. - Fixed a bug where
RuntimeError("Hook stack is in an invalid state")errors could be generated when using a webserver that reuses threads.